merged from trunk 20741:20848

* Missing changes to release/windows/installer
* Sequencer fixes in source/blender/src/seqaudio.c dont apply to 2.5
* brechts fix for #18855 r20763 wasnt merged, does this apply to 2.5?
This commit is contained in:
2009-06-13 11:09:13 +00:00
32 changed files with 756 additions and 370 deletions

View File

@@ -338,6 +338,7 @@ extern "C" void StartKetsjiShell(struct ScrArea *area,
ketsjiengine->SetCameraOverrideProjectionMatrix(projmat);
ketsjiengine->SetCameraOverrideViewMatrix(viewmat);
ketsjiengine->SetCameraOverrideClipping(v3d->near, v3d->far);
ketsjiengine->SetCameraOverrideLens(v3d->lens);
}
// create a scene converter, create and convert the startingscene

View File

@@ -28,8 +28,6 @@
#include "GL/glew.h"
#include "DNA_scene_types.h"
#include "RAS_IRenderTools.h"
#include "RAS_IRasterizer.h"
#include "RAS_LightObject.h"
@@ -41,6 +39,7 @@
#include "KX_BlenderMaterial.h"
#include "KX_RayCast.h"
#include "KX_IPhysicsController.h"
#include "KX_Light.h"
#include "PHY_IPhysicsEnvironment.h"
@@ -330,21 +329,12 @@ int KX_BlenderRenderTools::applyLights(int objectlayer, const MT_Transform& view
{
// taken from blender source, incompatibility between Blender Object / GameObject
KX_Scene* kxscene = (KX_Scene*)m_auxilaryClientInfo;
int scenelayer = ~0;
float glviewmat[16];
unsigned int count;
float vec[4];
std::vector<struct RAS_LightObject*>::iterator lit = m_lights.begin();
vec[3]= 1.0;
if(kxscene && kxscene->GetBlenderScene())
scenelayer = kxscene->GetBlenderScene()->lay;
for(count=0; count<m_numgllights; count++)
glDisable((GLenum)(GL_LIGHT0+count));
//std::vector<struct RAS_LightObject*> m_lights;
std::vector<struct RAS_LightObject*>::iterator lit = m_lights.begin();
viewmat.getValue(glviewmat);
@@ -353,82 +343,14 @@ int KX_BlenderRenderTools::applyLights(int objectlayer, const MT_Transform& view
for (lit = m_lights.begin(), count = 0; !(lit==m_lights.end()) && count < m_numgllights; ++lit)
{
RAS_LightObject* lightdata = (*lit);
KX_Scene* lightscene = (KX_Scene*)lightdata->m_scene;
KX_LightObject *kxlight = (KX_LightObject*)lightdata->m_light;
/* only use lights in the same layer as the object */
if(!(lightdata->m_layer & objectlayer))
continue;
/* only use lights in the same scene, and in a visible layer */
if(kxscene != lightscene || !(lightdata->m_layer & scenelayer))
continue;
vec[0] = (*(lightdata->m_worldmatrix))(0,3);
vec[1] = (*(lightdata->m_worldmatrix))(1,3);
vec[2] = (*(lightdata->m_worldmatrix))(2,3);
vec[3] = 1;
if(lightdata->m_type==RAS_LightObject::LIGHT_SUN) {
vec[0] = (*(lightdata->m_worldmatrix))(0,2);
vec[1] = (*(lightdata->m_worldmatrix))(1,2);
vec[2] = (*(lightdata->m_worldmatrix))(2,2);
//vec[0]= base->object->obmat[2][0];
//vec[1]= base->object->obmat[2][1];
//vec[2]= base->object->obmat[2][2];
vec[3]= 0.0;
glLightfv((GLenum)(GL_LIGHT0+count), GL_POSITION, vec);
}
else {
//vec[3]= 1.0;
glLightfv((GLenum)(GL_LIGHT0+count), GL_POSITION, vec);
glLightf((GLenum)(GL_LIGHT0+count), GL_CONSTANT_ATTENUATION, 1.0);
glLightf((GLenum)(GL_LIGHT0+count), GL_LINEAR_ATTENUATION, lightdata->m_att1/lightdata->m_distance);
// without this next line it looks backward compatible.
//attennuation still is acceptable
glLightf((GLenum)(GL_LIGHT0+count), GL_QUADRATIC_ATTENUATION, lightdata->m_att2/(lightdata->m_distance*lightdata->m_distance));
if(lightdata->m_type==RAS_LightObject::LIGHT_SPOT) {
vec[0] = -(*(lightdata->m_worldmatrix))(0,2);
vec[1] = -(*(lightdata->m_worldmatrix))(1,2);
vec[2] = -(*(lightdata->m_worldmatrix))(2,2);
//vec[0]= -base->object->obmat[2][0];
//vec[1]= -base->object->obmat[2][1];
//vec[2]= -base->object->obmat[2][2];
glLightfv((GLenum)(GL_LIGHT0+count), GL_SPOT_DIRECTION, vec);
glLightf((GLenum)(GL_LIGHT0+count), GL_SPOT_CUTOFF, lightdata->m_spotsize/2.0);
glLightf((GLenum)(GL_LIGHT0+count), GL_SPOT_EXPONENT, 128.0*lightdata->m_spotblend);
}
else glLightf((GLenum)(GL_LIGHT0+count), GL_SPOT_CUTOFF, 180.0);
}
if (lightdata->m_nodiffuse)
{
vec[0] = vec[1] = vec[2] = vec[3] = 0.0;
} else {
vec[0]= lightdata->m_energy*lightdata->m_red;
vec[1]= lightdata->m_energy*lightdata->m_green;
vec[2]= lightdata->m_energy*lightdata->m_blue;
vec[3]= 1.0;
}
glLightfv((GLenum)(GL_LIGHT0+count), GL_DIFFUSE, vec);
if (lightdata->m_nospecular)
{
vec[0] = vec[1] = vec[2] = vec[3] = 0.0;
} else if (lightdata->m_nodiffuse) {
vec[0]= lightdata->m_energy*lightdata->m_red;
vec[1]= lightdata->m_energy*lightdata->m_green;
vec[2]= lightdata->m_energy*lightdata->m_blue;
vec[3]= 1.0;
}
glLightfv((GLenum)(GL_LIGHT0+count), GL_SPECULAR, vec);
glEnable((GLenum)(GL_LIGHT0+count));
count++;
if(kxlight->ApplyLight(kxscene, objectlayer, count))
count++;
}
glPopMatrix();
return count;
}
void KX_BlenderRenderTools::MotionBlur(RAS_IRasterizer* rasterizer)

View File

@@ -209,6 +209,30 @@ static PyObject *listvalue_buffer_concat(PyObject * self, PyObject * other)
return listval_new->NewProxy(true); /* python owns this list */
}
static int listvalue_buffer_contains(PyObject *self_v, PyObject *value)
{
CListValue *self= static_cast<CListValue *>(BGE_PROXY_REF(self_v));
if (self==NULL) {
PyErr_SetString(PyExc_SystemError, "val in CList, "BGE_PROXY_ERROR_MSG);
return -1;
}
if (PyString_Check(value)) {
if (self->FindValue((const char *)PyString_AsString(value))) {
return 1;
}
}
else if (BGE_PROXY_CHECK_TYPE(value)) { /* not dict like at all but this worked before __contains__ was used */
CValue *item= static_cast<CValue *>(BGE_PROXY_REF(value));
for (int i=0; i < self->GetCount(); i++)
if (self->GetValue(i) == item) // Com
return 1;
} // not using CheckEqual
return 0;
}
static PySequenceMethods listvalue_as_sequence = {
@@ -225,6 +249,7 @@ static PySequenceMethods listvalue_as_sequence = {
NULL, /*sq_ass_item*/
NULL, /*sq_ass_slice*/
#endif
(objobjproc)listvalue_buffer_contains, /* sq_contains */
};
@@ -264,7 +289,9 @@ PyTypeObject CListValue::Type = {
0,
py_base_getattro,
py_base_setattro,
0,0,0,0,0,0,0,0,0,
0,
Py_TPFLAGS_DEFAULT,
0,0,0,0,0,0,0,
Methods
};
@@ -499,7 +526,7 @@ PyObject* CListValue::Pyreverse()
bool CListValue::CheckEqual(CValue* first,CValue* second)
{
bool result = false;
CValue* eqval = ((CValue*)first)->Calc(VALUE_EQL_OPERATOR,(CValue*)second);
if (eqval==NULL)
@@ -528,7 +555,7 @@ PyObject* CListValue::Pyindex(PyObject *value)
for (int i=0;i<numelem;i++)
{
CValue* elem = GetValue(i);
if (CheckEqual(checkobj,elem))
if (checkobj==elem || CheckEqual(checkobj,elem))
{
result = PyInt_FromLong(i);
break;
@@ -560,7 +587,7 @@ PyObject* CListValue::Pycount(PyObject* value)
for (int i=0;i<numelem;i++)
{
CValue* elem = GetValue(i);
if (CheckEqual(checkobj,elem))
if (checkobj==elem || CheckEqual(checkobj,elem))
{
numfound ++;
}

View File

@@ -113,8 +113,8 @@ typedef struct {
if ((m_ignore_deprecation_warnings || wlink.warn_done)==0) \
{ \
ShowDeprecationWarning_func(old_way, new_way); \
\
WarnLink *wlink_last= GetDeprecationWarningLinkLast(); \
ShowDeprecationWarning_func(old_way, new_way); \
wlink.warn_done = true; \
wlink.link = NULL; \
\

View File

@@ -29,8 +29,6 @@
#include "GL/glew.h"
#include "DNA_scene_types.h"
#include "RAS_IRenderTools.h"
#include "RAS_IRasterizer.h"
#include "RAS_LightObject.h"
@@ -42,6 +40,7 @@
#include "KX_BlenderMaterial.h"
#include "KX_RayCast.h"
#include "KX_IPhysicsController.h"
#include "KX_Light.h"
#include "PHY_IPhysicsEnvironment.h"
@@ -387,21 +386,12 @@ int GPC_RenderTools::applyLights(int objectlayer, const MT_Transform& viewmat)
{
// taken from blender source, incompatibility between Blender Object / GameObject
KX_Scene* kxscene = (KX_Scene*)m_auxilaryClientInfo;
int scenelayer = ~0;
float glviewmat[16];
unsigned int count;
float vec[4];
std::vector<struct RAS_LightObject*>::iterator lit = m_lights.begin();
vec[3]= 1.0;
if(kxscene && kxscene->GetBlenderScene())
scenelayer = kxscene->GetBlenderScene()->lay;
for(count=0; count<m_numgllights; count++)
glDisable((GLenum)(GL_LIGHT0+count));
//std::vector<struct RAS_LightObject*> m_lights;
std::vector<struct RAS_LightObject*>::iterator lit = m_lights.begin();
viewmat.getValue(glviewmat);
@@ -410,82 +400,14 @@ int GPC_RenderTools::applyLights(int objectlayer, const MT_Transform& viewmat)
for (lit = m_lights.begin(), count = 0; !(lit==m_lights.end()) && count < m_numgllights; ++lit)
{
RAS_LightObject* lightdata = (*lit);
KX_Scene* lightscene = (KX_Scene*)lightdata->m_scene;
KX_LightObject *kxlight = (KX_LightObject*)lightdata->m_light;
/* only use lights in the same layer as the object */
if(!(lightdata->m_layer & objectlayer))
continue;
/* only use lights in the same scene, and in a visible layer */
if(kxscene != lightscene || !(lightdata->m_layer & scenelayer))
continue;
vec[0] = (*(lightdata->m_worldmatrix))(0,3);
vec[1] = (*(lightdata->m_worldmatrix))(1,3);
vec[2] = (*(lightdata->m_worldmatrix))(2,3);
vec[3] = 1;
if(lightdata->m_type==RAS_LightObject::LIGHT_SUN) {
vec[0] = (*(lightdata->m_worldmatrix))(0,2);
vec[1] = (*(lightdata->m_worldmatrix))(1,2);
vec[2] = (*(lightdata->m_worldmatrix))(2,2);
//vec[0]= base->object->obmat[2][0];
//vec[1]= base->object->obmat[2][1];
//vec[2]= base->object->obmat[2][2];
vec[3]= 0.0;
glLightfv((GLenum)(GL_LIGHT0+count), GL_POSITION, vec);
}
else {
//vec[3]= 1.0;
glLightfv((GLenum)(GL_LIGHT0+count), GL_POSITION, vec);
glLightf((GLenum)(GL_LIGHT0+count), GL_CONSTANT_ATTENUATION, 1.0);
glLightf((GLenum)(GL_LIGHT0+count), GL_LINEAR_ATTENUATION, lightdata->m_att1/lightdata->m_distance);
// without this next line it looks backward compatible.
//attennuation still is acceptable
glLightf((GLenum)(GL_LIGHT0+count), GL_QUADRATIC_ATTENUATION, lightdata->m_att2/(lightdata->m_distance*lightdata->m_distance));
if(lightdata->m_type==RAS_LightObject::LIGHT_SPOT) {
vec[0] = -(*(lightdata->m_worldmatrix))(0,2);
vec[1] = -(*(lightdata->m_worldmatrix))(1,2);
vec[2] = -(*(lightdata->m_worldmatrix))(2,2);
//vec[0]= -base->object->obmat[2][0];
//vec[1]= -base->object->obmat[2][1];
//vec[2]= -base->object->obmat[2][2];
glLightfv((GLenum)(GL_LIGHT0+count), GL_SPOT_DIRECTION, vec);
glLightf((GLenum)(GL_LIGHT0+count), GL_SPOT_CUTOFF, lightdata->m_spotsize/2.0);
glLightf((GLenum)(GL_LIGHT0+count), GL_SPOT_EXPONENT, 128.0*lightdata->m_spotblend);
}
else glLightf((GLenum)(GL_LIGHT0+count), GL_SPOT_CUTOFF, 180.0);
}
if (lightdata->m_nodiffuse)
{
vec[0] = vec[1] = vec[2] = vec[3] = 0.0;
} else {
vec[0]= lightdata->m_energy*lightdata->m_red;
vec[1]= lightdata->m_energy*lightdata->m_green;
vec[2]= lightdata->m_energy*lightdata->m_blue;
vec[3]= 1.0;
}
glLightfv((GLenum)(GL_LIGHT0+count), GL_DIFFUSE, vec);
if (lightdata->m_nospecular)
{
vec[0] = vec[1] = vec[2] = vec[3] = 0.0;
} else if (lightdata->m_nodiffuse) {
vec[0]= lightdata->m_energy*lightdata->m_red;
vec[1]= lightdata->m_energy*lightdata->m_green;
vec[2]= lightdata->m_energy*lightdata->m_blue;
vec[3]= 1.0;
}
glLightfv((GLenum)(GL_LIGHT0+count), GL_SPECULAR, vec);
glEnable((GLenum)(GL_LIGHT0+count));
count++;
if(kxlight->ApplyLight(kxscene, objectlayer, count))
count++;
}
glPopMatrix();
return count;
}
void GPC_RenderTools::MotionBlur(RAS_IRasterizer* rasterizer)

View File

@@ -547,12 +547,15 @@ PyTypeObject KX_Camera::Type = {
0,
0,
py_base_repr,
0,0,
0,
&KX_GameObject::Sequence,
&KX_GameObject::Mapping,
0,0,0,
py_base_getattro,
py_base_setattro,
0,0,0,0,0,0,0,0,0,
0,
Py_TPFLAGS_DEFAULT,
0,0,0,0,0,0,0,
Methods
};

View File

@@ -1287,7 +1287,7 @@ PyObject* KX_GameObject::PyGetPosition()
return PyObjectFrom(NodeGetWorldPosition());
}
PyObject *KX_GameObject::Map_GetItem(PyObject *self_v, PyObject *item)
static PyObject *Map_GetItem(PyObject *self_v, PyObject *item)
{
KX_GameObject* self= static_cast<KX_GameObject*>BGE_PROXY_REF(self_v);
const char *attr_str= PyString_AsString(item);
@@ -1295,7 +1295,7 @@ PyObject *KX_GameObject::Map_GetItem(PyObject *self_v, PyObject *item)
PyObject* pyconvert;
if (self==NULL) {
PyErr_SetString(PyExc_SystemError, BGE_PROXY_ERROR_MSG);
PyErr_SetString(PyExc_SystemError, "val = gameOb[key]: KX_GameObject, "BGE_PROXY_ERROR_MSG);
return NULL;
}
@@ -1321,7 +1321,7 @@ PyObject *KX_GameObject::Map_GetItem(PyObject *self_v, PyObject *item)
}
int KX_GameObject::Map_SetItem(PyObject *self_v, PyObject *key, PyObject *val)
static int Map_SetItem(PyObject *self_v, PyObject *key, PyObject *val)
{
KX_GameObject* self= static_cast<KX_GameObject*>BGE_PROXY_REF(self_v);
const char *attr_str= PyString_AsString(key);
@@ -1329,7 +1329,7 @@ int KX_GameObject::Map_SetItem(PyObject *self_v, PyObject *key, PyObject *val)
PyErr_Clear();
if (self==NULL) {
PyErr_SetString(PyExc_SystemError, BGE_PROXY_ERROR_MSG);
PyErr_SetString(PyExc_SystemError, "gameOb[key] = value: KX_GameObject, "BGE_PROXY_ERROR_MSG);
return -1;
}
@@ -1409,11 +1409,40 @@ int KX_GameObject::Map_SetItem(PyObject *self_v, PyObject *key, PyObject *val)
return 0; /* success */
}
/* Cant set the len otherwise it can evaluate as false */
static int Seq_Contains(PyObject *self_v, PyObject *value)
{
KX_GameObject* self= static_cast<KX_GameObject*>BGE_PROXY_REF(self_v);
if (self==NULL) {
PyErr_SetString(PyExc_SystemError, "val in gameOb: KX_GameObject, "BGE_PROXY_ERROR_MSG);
return -1;
}
if(PyString_Check(value) && self->GetProperty(PyString_AsString(value)))
return 1;
if (self->m_attr_dict && PyDict_GetItem(self->m_attr_dict, value))
return 1;
return 0;
}
PyMappingMethods KX_GameObject::Mapping = {
(lenfunc)NULL , /*inquiry mp_length */
(binaryfunc)KX_GameObject::Map_GetItem, /*binaryfunc mp_subscript */
(objobjargproc)KX_GameObject::Map_SetItem, /*objobjargproc mp_ass_subscript */
(binaryfunc)Map_GetItem, /*binaryfunc mp_subscript */
(objobjargproc)Map_SetItem, /*objobjargproc mp_ass_subscript */
};
PySequenceMethods KX_GameObject::Sequence = {
NULL, /* Cant set the len otherwise it can evaluate as false */
NULL, /* sq_concat */
NULL, /* sq_repeat */
NULL, /* sq_item */
NULL, /* sq_slice */
NULL, /* sq_ass_item */
NULL, /* sq_ass_slice */
(objobjproc)Seq_Contains, /* sq_contains */
};
PyTypeObject KX_GameObject::Type = {
@@ -1433,12 +1462,15 @@ PyTypeObject KX_GameObject::Type = {
0,
0,
py_base_repr,
0,0,
0,
&Sequence,
&Mapping,
0,0,0,
py_base_getattro,
py_base_setattro,
0,0,0,0,0,0,0,0,0,
0,
Py_TPFLAGS_DEFAULT,
0,0,0,0,0,0,0,
Methods
};
@@ -2207,7 +2239,7 @@ PyObject* KX_GameObject::PyGetChildrenRecursive()
PyObject* KX_GameObject::PyGetMesh(PyObject* args)
{
ShowDeprecationWarning("getMesh()", "the meshes property");
ShowDeprecationWarning("getMesh()", "the meshes property (now a list of meshes)");
int mesh = 0;
@@ -2779,16 +2811,11 @@ PyObject* KX_GameObject::Pyget(PyObject *args)
/* Matches python dict.has_key() */
PyObject* KX_GameObject::Pyhas_key(PyObject* value)
{
if(PyString_Check(value) && GetProperty(PyString_AsString(value)))
Py_RETURN_TRUE;
if (m_attr_dict && PyDict_GetItem(m_attr_dict, value))
Py_RETURN_TRUE;
Py_RETURN_FALSE;
// the ONLY error case is invalid data, this is checked by the macro'd static function
// that calls this one. but make sure Seq_Contains doesnt add extra errors later on.
return PyBool_FromLong(Seq_Contains((PyObject *)this, value));
}
/* ---------------------------------------------------------------------
* Some stuff taken from the header
* --------------------------------------------------------------------- */

View File

@@ -917,10 +917,8 @@ public:
static PyObject* pyattr_get_actuators(void *self_v, const KX_PYATTRIBUTE_DEF *attrdef);
/* getitem/setitem */
static Py_ssize_t Map_Len(PyObject* self);
static PyMappingMethods Mapping;
static PyObject* Map_GetItem(PyObject *self_v, PyObject *item);
static int Map_SetItem(PyObject *self_v, PyObject *key, PyObject *val);
static PySequenceMethods Sequence;
private :

View File

@@ -1078,6 +1078,11 @@ void KX_KetsjiEngine::SetCameraOverrideClipping(float near, float far)
m_overrideCamFar = far;
}
void KX_KetsjiEngine::SetCameraOverrideLens(float lens)
{
m_overrideCamLens = lens;
}
void KX_KetsjiEngine::GetSceneViewport(KX_Scene *scene, KX_Camera* cam, RAS_Rect& area, RAS_Rect& viewport)
{
// In this function we make sure the rasterizer settings are upto
@@ -1351,6 +1356,8 @@ void KX_KetsjiEngine::PostProcessScene(KX_Scene* scene)
KX_Camera* activecam = NULL;
RAS_CameraData camdata = RAS_CameraData();
if (override_camera) camdata.m_lens = m_overrideCamLens;
activecam = new KX_Camera(scene,KX_Scene::m_callbacks,camdata);
activecam->SetName("__default__cam__");

View File

@@ -129,6 +129,7 @@ private:
MT_CmMatrix4x4 m_overrideCamViewMat;
float m_overrideCamNear;
float m_overrideCamFar;
float m_overrideCamLens;
bool m_stereo;
int m_curreye;
@@ -253,6 +254,7 @@ public:
void SetCameraOverrideProjectionMatrix(const MT_CmMatrix4x4& mat);
void SetCameraOverrideViewMatrix(const MT_CmMatrix4x4& mat);
void SetCameraOverrideClipping(float near, float far);
void SetCameraOverrideLens(float lens);
/**
* Sets display of all frames.

View File

@@ -35,6 +35,8 @@
#pragma warning (disable : 4786)
#endif
#include "GL/glew.h"
#include "KX_Light.h"
#include "KX_Camera.h"
#include "RAS_IRasterizer.h"
@@ -43,6 +45,7 @@
#include "KX_PyMath.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "GPU_material.h"
KX_LightObject::KX_LightObject(void* sgReplicationInfo,SG_Callbacks callbacks,
@@ -56,8 +59,8 @@ KX_LightObject::KX_LightObject(void* sgReplicationInfo,SG_Callbacks callbacks,
m_rendertools(rendertools)
{
m_lightobj = lightobj;
m_lightobj.m_worldmatrix = GetOpenGLMatrixPtr();
m_lightobj.m_scene = sgReplicationInfo;
m_lightobj.m_light = this;
m_rendertools->AddLight(&m_lightobj);
m_glsl = glsl;
m_blenderscene = ((KX_Scene*)sgReplicationInfo)->GetBlenderScene();
@@ -84,12 +87,102 @@ CValue* KX_LightObject::GetReplica()
replica->ProcessReplica();
replica->m_lightobj.m_worldmatrix = replica->GetOpenGLMatrixPtr();
replica->m_lightobj.m_light = replica;
m_rendertools->AddLight(&replica->m_lightobj);
return replica;
}
bool KX_LightObject::ApplyLight(KX_Scene *kxscene, int oblayer, int slot)
{
KX_Scene* lightscene = (KX_Scene*)m_lightobj.m_scene;
float vec[4];
int scenelayer = ~0;
if(kxscene && kxscene->GetBlenderScene())
scenelayer = kxscene->GetBlenderScene()->lay;
/* only use lights in the same layer as the object */
if(!(m_lightobj.m_layer & oblayer))
return false;
/* only use lights in the same scene, and in a visible layer */
if(kxscene != lightscene || !(m_lightobj.m_layer & scenelayer))
return false;
// lights don't get their openGL matrix updated, do it now
if(GetSGNode()->IsDirty())
GetOpenGLMatrix();
MT_CmMatrix4x4& worldmatrix= *GetOpenGLMatrixPtr();
vec[0] = worldmatrix(0,3);
vec[1] = worldmatrix(1,3);
vec[2] = worldmatrix(2,3);
vec[3] = 1.0f;
if(m_lightobj.m_type==RAS_LightObject::LIGHT_SUN) {
vec[0] = worldmatrix(0,2);
vec[1] = worldmatrix(1,2);
vec[2] = worldmatrix(2,2);
//vec[0]= base->object->obmat[2][0];
//vec[1]= base->object->obmat[2][1];
//vec[2]= base->object->obmat[2][2];
vec[3]= 0.0;
glLightfv((GLenum)(GL_LIGHT0+slot), GL_POSITION, vec);
}
else {
//vec[3]= 1.0;
glLightfv((GLenum)(GL_LIGHT0+slot), GL_POSITION, vec);
glLightf((GLenum)(GL_LIGHT0+slot), GL_CONSTANT_ATTENUATION, 1.0);
glLightf((GLenum)(GL_LIGHT0+slot), GL_LINEAR_ATTENUATION, m_lightobj.m_att1/m_lightobj.m_distance);
// without this next line it looks backward compatible.
//attennuation still is acceptable
glLightf((GLenum)(GL_LIGHT0+slot), GL_QUADRATIC_ATTENUATION, m_lightobj.m_att2/(m_lightobj.m_distance*m_lightobj.m_distance));
if(m_lightobj.m_type==RAS_LightObject::LIGHT_SPOT) {
vec[0] = -worldmatrix(0,2);
vec[1] = -worldmatrix(1,2);
vec[2] = -worldmatrix(2,2);
//vec[0]= -base->object->obmat[2][0];
//vec[1]= -base->object->obmat[2][1];
//vec[2]= -base->object->obmat[2][2];
glLightfv((GLenum)(GL_LIGHT0+slot), GL_SPOT_DIRECTION, vec);
glLightf((GLenum)(GL_LIGHT0+slot), GL_SPOT_CUTOFF, m_lightobj.m_spotsize/2.0);
glLightf((GLenum)(GL_LIGHT0+slot), GL_SPOT_EXPONENT, 128.0*m_lightobj.m_spotblend);
}
else
glLightf((GLenum)(GL_LIGHT0+slot), GL_SPOT_CUTOFF, 180.0);
}
if (m_lightobj.m_nodiffuse) {
vec[0] = vec[1] = vec[2] = vec[3] = 0.0;
}
else {
vec[0]= m_lightobj.m_energy*m_lightobj.m_red;
vec[1]= m_lightobj.m_energy*m_lightobj.m_green;
vec[2]= m_lightobj.m_energy*m_lightobj.m_blue;
vec[3]= 1.0;
}
glLightfv((GLenum)(GL_LIGHT0+slot), GL_DIFFUSE, vec);
if(m_lightobj.m_nospecular)
{
vec[0] = vec[1] = vec[2] = vec[3] = 0.0;
}
else if (m_lightobj.m_nodiffuse) {
vec[0]= m_lightobj.m_energy*m_lightobj.m_red;
vec[1]= m_lightobj.m_energy*m_lightobj.m_green;
vec[2]= m_lightobj.m_energy*m_lightobj.m_blue;
vec[3]= 1.0;
}
glLightfv((GLenum)(GL_LIGHT0+slot), GL_SPECULAR, vec);
glEnable((GLenum)(GL_LIGHT0+slot));
return true;
}
GPULamp *KX_LightObject::GetGPULamp()
{
if(m_glsl)
@@ -200,12 +293,15 @@ PyTypeObject KX_LightObject::Type = {
0,
0,
py_base_repr,
0,0,
0,
&KX_GameObject::Sequence,
&KX_GameObject::Mapping,
0,0,0,
py_base_getattro,
py_base_setattro,
0,0,0,0,0,0,0,0,0,
0,
Py_TPFLAGS_DEFAULT,
0,0,0,0,0,0,0,
Methods
};

View File

@@ -54,7 +54,10 @@ public:
virtual CValue* GetReplica();
RAS_LightObject* GetLightData() { return &m_lightobj;}
/* GLSL shadow */
/* OpenGL Light */
bool ApplyLight(KX_Scene *kxscene, int oblayer, int slot);
/* GLSL Light */
struct GPULamp *GetGPULamp();
bool HasShadowBuffer();
int GetShadowLayer();

View File

@@ -112,7 +112,7 @@ bool KX_SoundActuator::Update(double curtime, bool frame)
return false;
// actual audio device playing state
bool isplaying = (m_soundObject->GetPlaystate() != SND_STOPPED) ? true : false;
bool isplaying = (m_soundObject->GetPlaystate() != SND_STOPPED && m_soundObject->GetPlaystate() != SND_INITIAL) ? true : false;
if (m_pino)
{
@@ -194,7 +194,7 @@ bool KX_SoundActuator::Update(double curtime, bool frame)
}
}
// verify that the sound is still playing
isplaying = (m_soundObject->GetPlaystate() != SND_STOPPED) ? true : false;
isplaying = (m_soundObject->GetPlaystate() != SND_STOPPED && m_soundObject->GetPlaystate() != SND_INITIAL) ? true : false;
if (isplaying)
{

View File

@@ -1016,14 +1016,21 @@ void CcdPhysicsController::ApplyTorque(float torqueX,float torqueY,float torque
}
if (body)
{
//workaround for incompatibility between 'DYNAMIC' game object, and angular factor
//a DYNAMIC object has some inconsistency: it has no angular effect due to collisions, but still has torque
const btVector3& angFac = body->getAngularFactor();
btVector3 tmpFac(0,0,1);
body->setAngularFactor(tmpFac);
body->applyTorque(torque);
body->setAngularFactor(angFac);
}
if (m_cci.m_bRigid)
{
body->applyTorque(torque);
}
else
{
//workaround for incompatibility between 'DYNAMIC' game object, and angular factor
//a DYNAMIC object has some inconsistency: it has no angular effect due to collisions, but still has torque
const btVector3& angFac = body->getAngularFactor();
btVector3 tmpFac(0,0,1);
body->setAngularFactor(tmpFac);
body->applyTorque(torque);
body->setAngularFactor(angFac);
}
}
}
}

View File

@@ -39,8 +39,9 @@ struct RAS_LightObject
LIGHT_NORMAL
};
bool m_modified;
int m_layer;
int m_layer;
void *m_scene;
void *m_light;
float m_energy;
float m_distance;
@@ -55,7 +56,6 @@ struct RAS_LightObject
float m_spotblend;
LightType m_type;
MT_CmMatrix4x4* m_worldmatrix;
bool m_nodiffuse;
bool m_nospecular;