BGE: Use float as default instead of double in Moto library.

Use float in moto instead of double for MT_Scalar.
This switch allow future optimization like SSE.
Additionally, it changes the OpenGL calls to float versions as they are
very bad with doubles.

Reviewers: campbellbarton, moguri, lordloki

Reviewed By: lordloki

Subscribers: brecht, lordloki

Differential Revision: https://developer.blender.org/D1610
This commit is contained in:
2015-12-13 02:01:28 +01:00
committed by Jorge Bernal
parent 9df6a539a2
commit 6329e20cbb
16 changed files with 59 additions and 56 deletions

View File

@@ -55,7 +55,7 @@ class MT_CmMatrix4x4
public : public :
MT_CmMatrix4x4( MT_CmMatrix4x4(
const float value[4][4] const MT_Scalar value[4][4]
); );
MT_CmMatrix4x4( MT_CmMatrix4x4(
@@ -63,7 +63,7 @@ public :
MT_CmMatrix4x4( MT_CmMatrix4x4(
const double value[16] const MT_Scalar value[16]
); );
MT_CmMatrix4x4( MT_CmMatrix4x4(
@@ -85,19 +85,19 @@ public :
const MT_CmMatrix4x4 & other const MT_CmMatrix4x4 & other
); );
double* MT_Scalar*
getPointer( getPointer(
); );
const const
double* MT_Scalar*
getPointer( getPointer(
) const; ) const;
void void
setElem( setElem(
int pos, int pos,
double newvalue MT_Scalar newvalue
); );
MT_Vector3 MT_Vector3
@@ -121,7 +121,7 @@ public :
const MT_Vector3 & v const MT_Vector3 & v
); );
double& MT_Scalar&
operator ( operator (
) (int row,int col) { return m_V[col][row]; } ) (int row,int col) { return m_V[col][row]; }
@@ -139,8 +139,8 @@ public :
protected: protected:
union union
{ {
double m_V[4][4]; MT_Scalar m_V[4][4];
double m_Vflat[16]; MT_Scalar m_Vflat[16];
}; };
}; };

View File

@@ -52,7 +52,7 @@
#include "MT_random.h" #include "MT_random.h"
typedef double MT_Scalar; //this should be float ! typedef float MT_Scalar;
const MT_Scalar MT_DEGS_PER_RAD(57.29577951308232286465); const MT_Scalar MT_DEGS_PER_RAD(57.29577951308232286465);

View File

@@ -42,7 +42,7 @@ MT_CmMatrix4x4::MT_CmMatrix4x4()
MT_CmMatrix4x4::MT_CmMatrix4x4(const float value[4][4]) MT_CmMatrix4x4::MT_CmMatrix4x4(const MT_Scalar value[4][4])
{ {
for (int i=0;i<4;i++) for (int i=0;i<4;i++)
{ {
@@ -53,7 +53,7 @@ MT_CmMatrix4x4::MT_CmMatrix4x4(const float value[4][4])
MT_CmMatrix4x4::MT_CmMatrix4x4(const double value[16]) MT_CmMatrix4x4::MT_CmMatrix4x4(const MT_Scalar value[16])
{ {
for (int i=0;i<16;i++) for (int i=0;i<16;i++)
m_Vflat[i] = value[i]; m_Vflat[i] = value[i];
@@ -148,21 +148,21 @@ void MT_CmMatrix4x4::SetMatrix(const MT_CmMatrix4x4& other)
double* MT_CmMatrix4x4::getPointer() MT_Scalar* MT_CmMatrix4x4::getPointer()
{ {
return &m_V[0][0]; return &m_V[0][0];
} }
const double* MT_CmMatrix4x4::getPointer() const const MT_Scalar* MT_CmMatrix4x4::getPointer() const
{ {
return &m_V[0][0]; return &m_V[0][0];
} }
void MT_CmMatrix4x4::setElem(int pos,double newvalue) void MT_CmMatrix4x4::setElem(int pos,MT_Scalar newvalue)
{ {
m_Vflat[pos] = newvalue; m_Vflat[pos] = newvalue;
} }

View File

@@ -194,7 +194,10 @@ void KX_FontObject::DrawFontText()
/* Get a working copy of the OpenGLMatrix to use */ /* Get a working copy of the OpenGLMatrix to use */
double mat[16]; double mat[16];
memcpy(mat, this->GetOpenGLMatrix(), sizeof(double)*16); float *origmat = GetOpenGLMatrix();
for (unsigned short i = 0; i < 16; ++i) {
mat[i] = (double)origmat[i];
}
/* Account for offset */ /* Account for offset */
MT_Vector3 offset = this->NodeGetWorldOrientation() * m_offset * this->NodeGetWorldScaling(); MT_Vector3 offset = this->NodeGetWorldOrientation() * m_offset * this->NodeGetWorldScaling();

View File

@@ -700,10 +700,10 @@ void KX_GameObject::ApplyRotation(const MT_Vector3& drot,bool local)
/** /**
* GetOpenGL Matrix, returns an OpenGL 'compatible' matrix * GetOpenGL Matrix, returns an OpenGL 'compatible' matrix
*/ */
double* KX_GameObject::GetOpenGLMatrix() float *KX_GameObject::GetOpenGLMatrix()
{ {
// todo: optimize and only update if necessary // todo: optimize and only update if necessary
double* fl = m_OpenGL_4x4Matrix.getPointer(); float *fl = m_OpenGL_4x4Matrix.getPointer();
if (GetSGNode()) { if (GetSGNode()) {
MT_Transform trans; MT_Transform trans;
@@ -742,7 +742,7 @@ void KX_GameObject::AddMeshUser()
m_meshes[i]->AddMeshUser(this, &m_meshSlots, GetDeformer()); m_meshes[i]->AddMeshUser(this, &m_meshSlots, GetDeformer());
} }
// set the part of the mesh slot that never change // set the part of the mesh slot that never change
double* fl = GetOpenGLMatrixPtr()->getPointer(); float *fl = GetOpenGLMatrixPtr()->getPointer();
SG_QList::iterator<RAS_MeshSlot> mit(m_meshSlots); SG_QList::iterator<RAS_MeshSlot> mit(m_meshSlots);
// RAS_MeshSlot* ms; // RAS_MeshSlot* ms;
@@ -2768,7 +2768,7 @@ PyObject *KX_GameObject::pyattr_get_localTransform(void *self_v, const KX_PYATTR
{ {
KX_GameObject* self = static_cast<KX_GameObject*>(self_v); KX_GameObject* self = static_cast<KX_GameObject*>(self_v);
double mat[16]; float mat[16];
MT_Transform trans; MT_Transform trans;

View File

@@ -175,7 +175,7 @@ public:
* side effect of storing the result internally. The * side effect of storing the result internally. The
* memory for the matrix remains the property of this class. * memory for the matrix remains the property of this class.
*/ */
double * float *
GetOpenGLMatrix( GetOpenGLMatrix(
); );

View File

@@ -1557,9 +1557,9 @@ void KX_Scene::CalculateVisibleMeshes(RAS_IRasterizer* rasty,KX_Camera* cam, int
planes[5].setValue(cplanes[3].getValue()); // bottom planes[5].setValue(cplanes[3].getValue()); // bottom
CullingInfo info(layer); CullingInfo info(layer);
double mvmat[16] = {0}; float mvmat[16] = {0};
cam->GetModelviewMatrix().getValue(mvmat); cam->GetModelviewMatrix().getValue(mvmat);
double pmat[16] = {0}; float pmat[16] = {0};
cam->GetProjectionMatrix().getValue(pmat); cam->GetProjectionMatrix().getValue(pmat);
dbvt_culling = m_physicsEnvironment->CullingTest(PhysicsCullingCallback,&info,planes,5,m_dbvt_occlusion_res, dbvt_culling = m_physicsEnvironment->CullingTest(PhysicsCullingCallback,&info,planes,5,m_dbvt_occlusion_res,

View File

@@ -1472,7 +1472,7 @@ struct OcclusionBuffer
m[15] = btScalar(m1[3] * m2[12] + m1[7] * m2[13] + m1[11] * m2[14] + m1[15] * m2[15]); m[15] = btScalar(m1[3] * m2[12] + m1[7] * m2[13] + m1[11] * m2[14] + m1[15] * m2[15]);
} }
void setup(int size, const int *view, double modelview[16], double projection[16]) void setup(int size, const int *view, float modelview[16], float projection[16])
{ {
m_initialized = false; m_initialized = false;
m_occlusion = false; m_occlusion = false;
@@ -1519,7 +1519,7 @@ struct OcclusionBuffer
m_occlusion = false; m_occlusion = false;
} }
void SetModelMatrix(double *fl) void SetModelMatrix(float *fl)
{ {
CMmat4mul(m_mtc,m_wtc,fl); CMmat4mul(m_mtc,m_wtc,fl);
if (!m_initialized) { if (!m_initialized) {
@@ -1969,7 +1969,7 @@ struct DbvtCullingCallback : btDbvt::ICollide
KX_GameObject* gameobj = KX_GameObject::GetClientObject(info); KX_GameObject* gameobj = KX_GameObject::GetClientObject(info);
if (gameobj && gameobj->GetOccluder()) if (gameobj && gameobj->GetOccluder())
{ {
double* fl = gameobj->GetOpenGLMatrixPtr()->getPointer(); float *fl = gameobj->GetOpenGLMatrixPtr()->getPointer();
// this will create the occlusion buffer if not already done // this will create the occlusion buffer if not already done
// and compute the transformation from model local space to clip space // and compute the transformation from model local space to clip space
m_ocb->SetModelMatrix(fl); m_ocb->SetModelMatrix(fl);
@@ -2010,7 +2010,7 @@ struct DbvtCullingCallback : btDbvt::ICollide
}; };
static OcclusionBuffer gOcb; static OcclusionBuffer gOcb;
bool CcdPhysicsEnvironment::CullingTest(PHY_CullingCallback callback, void* userData, MT_Vector4 *planes, int nplanes, int occlusionRes, const int *viewport, double modelview[16], double projection[16]) bool CcdPhysicsEnvironment::CullingTest(PHY_CullingCallback callback, void* userData, MT_Vector4 *planes, int nplanes, int occlusionRes, const int *viewport, float modelview[16], float projection[16])
{ {
if (!m_cullingTree) if (!m_cullingTree)
return false; return false;

View File

@@ -211,7 +211,7 @@ protected:
btTypedConstraint* GetConstraintById(int constraintId); btTypedConstraint* GetConstraintById(int constraintId);
virtual PHY_IPhysicsController* RayTest(PHY_IRayCastFilterCallback &filterCallback, float fromX,float fromY,float fromZ, float toX,float toY,float toZ); virtual PHY_IPhysicsController* RayTest(PHY_IRayCastFilterCallback &filterCallback, float fromX,float fromY,float fromZ, float toX,float toY,float toZ);
virtual bool CullingTest(PHY_CullingCallback callback, void* userData, MT_Vector4* planes, int nplanes, int occlusionRes, const int *viewport, double modelview[16], double projection[16]); virtual bool CullingTest(PHY_CullingCallback callback, void* userData, MT_Vector4* planes, int nplanes, int occlusionRes, const int *viewport, float modelview[16], float projection[16]);
//Methods for gamelogic collision/physics callbacks //Methods for gamelogic collision/physics callbacks

View File

@@ -83,7 +83,7 @@ public:
} }
virtual PHY_IPhysicsController* RayTest(PHY_IRayCastFilterCallback &filterCallback, float fromX,float fromY,float fromZ, float toX,float toY,float toZ); virtual PHY_IPhysicsController* RayTest(PHY_IRayCastFilterCallback &filterCallback, float fromX,float fromY,float fromZ, float toX,float toY,float toZ);
virtual bool CullingTest(PHY_CullingCallback callback, void* userData, class MT_Vector4* planes, int nplanes, int occlusionRes, const int *viewport, double modelview[16], double projection[16]) { return false; } virtual bool CullingTest(PHY_CullingCallback callback, void* userData, class MT_Vector4* planes, int nplanes, int occlusionRes, const int *viewport, float modelview[16], float projection[16]) { return false; }
//gamelogic callbacks //gamelogic callbacks

View File

@@ -183,7 +183,7 @@ class PHY_IPhysicsEnvironment
//culling based on physical broad phase //culling based on physical broad phase
// the plane number must be set as follow: near, far, left, right, top, botton // the plane number must be set as follow: near, far, left, right, top, botton
// the near plane must be the first one and must always be present, it is used to get the direction of the view // the near plane must be the first one and must always be present, it is used to get the direction of the view
virtual bool CullingTest(PHY_CullingCallback callback, void *userData, MT_Vector4* planeNormals, int planeNumber, int occlusionRes, const int *viewport, double modelview[16], double projection[16]) = 0; virtual bool CullingTest(PHY_CullingCallback callback, void *userData, MT_Vector4* planeNormals, int planeNumber, int occlusionRes, const int *viewport, float modelview[16], float projection[16]) = 0;
//Methods for gamelogic collision/physics callbacks //Methods for gamelogic collision/physics callbacks
//todo: //todo:

View File

@@ -422,7 +422,7 @@ public:
/** /**
* Render Tools * Render Tools
*/ */
virtual void applyTransform(double *oglmatrix, int drawingmode) = 0; virtual void applyTransform(float *oglmatrix, int drawingmode) = 0;
/** /**
* Renders 2D boxes. * Renders 2D boxes.

View File

@@ -128,7 +128,7 @@ public:
void* m_clientObj; void* m_clientObj;
RAS_Deformer* m_pDeformer; RAS_Deformer* m_pDeformer;
DerivedMesh* m_pDerivedMesh; DerivedMesh* m_pDerivedMesh;
double* m_OpenGLMatrix; float* m_OpenGLMatrix;
// visibility // visibility
bool m_bVisible; bool m_bVisible;
bool m_bCulled; bool m_bCulled;

View File

@@ -262,7 +262,7 @@ void RAS_OpenGLLight::Update()
// lights don't get their openGL matrix updated, do it now // lights don't get their openGL matrix updated, do it now
if (kxlight->GetSGNode()->IsDirty()) if (kxlight->GetSGNode()->IsDirty())
kxlight->GetOpenGLMatrix(); kxlight->GetOpenGLMatrix();
double *dobmat = kxlight->GetOpenGLMatrixPtr()->getPointer(); float *dobmat = kxlight->GetOpenGLMatrixPtr()->getPointer();
for (int i=0; i<4; i++) for (int i=0; i<4; i++)
for (int j=0; j<4; j++, dobmat++) for (int j=0; j<4; j++, dobmat++)

View File

@@ -371,8 +371,8 @@ void RAS_OpenGLRasterizer::FlushDebugShapes(SCA_IScene *scene)
glColor4f(debugShapes[i].m_color[0], debugShapes[i].m_color[1], debugShapes[i].m_color[2], 1.0f); glColor4f(debugShapes[i].m_color[0], debugShapes[i].m_color[1], debugShapes[i].m_color[2], 1.0f);
const MT_Scalar *fromPtr = &debugShapes[i].m_pos.x(); const MT_Scalar *fromPtr = &debugShapes[i].m_pos.x();
const MT_Scalar *toPtr= &debugShapes[i].m_param.x(); const MT_Scalar *toPtr= &debugShapes[i].m_param.x();
glVertex3dv(fromPtr); glVertex3fv(fromPtr);
glVertex3dv(toPtr); glVertex3fv(toPtr);
} }
glEnd(); glEnd();
@@ -408,7 +408,7 @@ void RAS_OpenGLRasterizer::FlushDebugShapes(SCA_IScene *scene)
pos = pos*tr; pos = pos*tr;
pos += debugShapes[i].m_pos; pos += debugShapes[i].m_pos;
const MT_Scalar* posPtr = &pos.x(); const MT_Scalar* posPtr = &pos.x();
glVertex3dv(posPtr); glVertex3fv(posPtr);
} }
glEnd(); glEnd();
} }
@@ -823,8 +823,8 @@ void RAS_OpenGLRasterizer::DrawDerivedMesh(class RAS_MeshSlot &ms)
void RAS_OpenGLRasterizer::SetProjectionMatrix(MT_CmMatrix4x4 &mat) void RAS_OpenGLRasterizer::SetProjectionMatrix(MT_CmMatrix4x4 &mat)
{ {
glMatrixMode(GL_PROJECTION); glMatrixMode(GL_PROJECTION);
double* matrix = &mat(0, 0); float* matrix = &mat(0, 0);
glLoadMatrixd(matrix); glLoadMatrixf(matrix);
m_camortho = (mat(3, 3) != 0.0); m_camortho = (mat(3, 3) != 0.0);
} }
@@ -832,11 +832,11 @@ void RAS_OpenGLRasterizer::SetProjectionMatrix(MT_CmMatrix4x4 &mat)
void RAS_OpenGLRasterizer::SetProjectionMatrix(const MT_Matrix4x4 & mat) void RAS_OpenGLRasterizer::SetProjectionMatrix(const MT_Matrix4x4 & mat)
{ {
glMatrixMode(GL_PROJECTION); glMatrixMode(GL_PROJECTION);
double matrix[16]; float matrix[16];
/* Get into argument. Looks a bit dodgy, but it's ok. */ /* Get into argument. Looks a bit dodgy, but it's ok. */
mat.getValue(matrix); mat.getValue(matrix);
/* Internally, MT_Matrix4x4 uses doubles (MT_Scalar). */ /* Internally, MT_Matrix4x4 uses doubles (MT_Scalar). */
glLoadMatrixd(matrix); glLoadMatrixf(matrix);
m_camortho= (mat[3][3] != 0.0); m_camortho= (mat[3][3] != 0.0);
} }
@@ -852,7 +852,7 @@ MT_Matrix4x4 RAS_OpenGLRasterizer::GetFrustumMatrix(
bool bool
) { ) {
MT_Matrix4x4 result; MT_Matrix4x4 result;
double mat[16]; float mat[16];
// correction for stereo // correction for stereo
if (Stereo()) if (Stereo())
@@ -891,7 +891,7 @@ MT_Matrix4x4 RAS_OpenGLRasterizer::GetFrustumMatrix(
glLoadIdentity(); glLoadIdentity();
glFrustum(left, right, bottom, top, frustnear, frustfar); glFrustum(left, right, bottom, top, frustnear, frustfar);
glGetDoublev(GL_PROJECTION_MATRIX, mat); glGetFloatv(GL_PROJECTION_MATRIX, mat);
result.setValue(mat); result.setValue(mat);
return result; return result;
@@ -906,14 +906,14 @@ MT_Matrix4x4 RAS_OpenGLRasterizer::GetOrthoMatrix(
float frustfar float frustfar
) { ) {
MT_Matrix4x4 result; MT_Matrix4x4 result;
double mat[16]; float mat[16];
// stereo is meaning less for orthographic, disable it // stereo is meaning less for orthographic, disable it
glMatrixMode(GL_PROJECTION); glMatrixMode(GL_PROJECTION);
glLoadIdentity(); glLoadIdentity();
glOrtho(left, right, bottom, top, frustnear, frustfar); glOrtho(left, right, bottom, top, frustnear, frustfar);
glGetDoublev(GL_PROJECTION_MATRIX, mat); glGetFloatv(GL_PROJECTION_MATRIX, mat);
result.setValue(mat); result.setValue(mat);
return result; return result;
@@ -974,7 +974,7 @@ void RAS_OpenGLRasterizer::SetViewMatrix(const MT_Matrix4x4 &mat,
m_viewmatrix.getValue(glviewmat); m_viewmatrix.getValue(glviewmat);
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
glLoadMatrixd(glviewmat); glLoadMatrixf(glviewmat);
m_campos = pos; m_campos = pos;
} }
@@ -1287,7 +1287,7 @@ void RAS_OpenGLRasterizer::RemoveLight(RAS_ILightObject* lightobject)
m_lights.erase(lit); m_lights.erase(lit);
} }
bool RAS_OpenGLRasterizer::RayHit(struct KX_ClientObjectInfo *client, KX_RayCast *result, double *oglmatrix) bool RAS_OpenGLRasterizer::RayHit(struct KX_ClientObjectInfo *client, KX_RayCast *result, float *oglmatrix)
{ {
if (result->m_hitMesh) { if (result->m_hitMesh) {
@@ -1301,14 +1301,14 @@ bool RAS_OpenGLRasterizer::RayHit(struct KX_ClientObjectInfo *client, KX_RayCast
left = (dir.cross(resultnormal)).safe_normalized(); left = (dir.cross(resultnormal)).safe_normalized();
// for the up vector, we take the 'resultnormal' returned by the physics // for the up vector, we take the 'resultnormal' returned by the physics
double maat[16] = {left[0], left[1], left[2], 0, float maat[16] = {left[0], left[1], left[2], 0,
dir[0], dir[1], dir[2], 0, dir[0], dir[1], dir[2], 0,
resultnormal[0], resultnormal[1], resultnormal[2], 0, resultnormal[0], resultnormal[1], resultnormal[2], 0,
0, 0, 0, 1}; 0, 0, 0, 1};
glTranslated(oglmatrix[12],oglmatrix[13],oglmatrix[14]); glTranslatef(oglmatrix[12],oglmatrix[13],oglmatrix[14]);
//glMultMatrixd(oglmatrix); //glMultMatrixd(oglmatrix);
glMultMatrixd(maat); glMultMatrixf(maat);
return true; return true;
} }
else { else {
@@ -1316,7 +1316,7 @@ bool RAS_OpenGLRasterizer::RayHit(struct KX_ClientObjectInfo *client, KX_RayCast
} }
} }
void RAS_OpenGLRasterizer::applyTransform(double* oglmatrix,int objectdrawmode ) void RAS_OpenGLRasterizer::applyTransform(float* oglmatrix,int objectdrawmode )
{ {
/* FIXME: /* FIXME:
blender: intern/moto/include/MT_Vector3.inl:42: MT_Vector3 operator/(const blender: intern/moto/include/MT_Vector3.inl:42: MT_Vector3 operator/(const
@@ -1369,13 +1369,13 @@ void RAS_OpenGLRasterizer::applyTransform(double* oglmatrix,int objectdrawmode )
dir *= size[1]; dir *= size[1];
up *= size[2]; up *= size[2];
double maat[16] = {left[0], left[1], left[2], 0, float maat[16] = {left[0], left[1], left[2], 0,
dir[0], dir[1], dir[2], 0, dir[0], dir[1], dir[2], 0,
up[0], up[1], up[2], 0, up[0], up[1], up[2], 0,
0, 0, 0, 1}; 0, 0, 0, 1};
glTranslatef(objpos[0],objpos[1],objpos[2]); glTranslatef(objpos[0],objpos[1],objpos[2]);
glMultMatrixd(maat); glMultMatrixf(maat);
} }
else { else {
@@ -1399,11 +1399,11 @@ void RAS_OpenGLRasterizer::applyTransform(double* oglmatrix,int objectdrawmode )
if (!physics_controller && parent) if (!physics_controller && parent)
physics_controller = parent->GetPhysicsController(); physics_controller = parent->GetPhysicsController();
KX_RayCast::Callback<RAS_OpenGLRasterizer, double> callback(this, physics_controller, oglmatrix); KX_RayCast::Callback<RAS_OpenGLRasterizer, float> callback(this, physics_controller, oglmatrix);
if (!KX_RayCast::RayTest(physics_environment, frompoint, topoint, callback)) if (!KX_RayCast::RayTest(physics_environment, frompoint, topoint, callback))
{ {
// couldn't find something to cast the shadow on... // couldn't find something to cast the shadow on...
glMultMatrixd(oglmatrix); glMultMatrixf(oglmatrix);
} }
else else
{ // we found the "ground", but the cast matrix doesn't take { // we found the "ground", but the cast matrix doesn't take
@@ -1415,7 +1415,7 @@ void RAS_OpenGLRasterizer::applyTransform(double* oglmatrix,int objectdrawmode )
{ {
// 'normal' object // 'normal' object
glMultMatrixd(oglmatrix); glMultMatrixf(oglmatrix);
} }
} }
} }

View File

@@ -301,13 +301,13 @@ public:
void RenderText2D(RAS_TEXT_RENDER_MODE mode, const char *text, void RenderText2D(RAS_TEXT_RENDER_MODE mode, const char *text,
int xco, int yco, int width, int height); int xco, int yco, int width, int height);
void applyTransform(double *oglmatrix, int objectdrawmode); void applyTransform(float *oglmatrix, int objectdrawmode);
void PushMatrix(); void PushMatrix();
void PopMatrix(); void PopMatrix();
/// \see KX_RayCast /// \see KX_RayCast
bool RayHit(struct KX_ClientObjectInfo *client, class KX_RayCast *result, double *oglmatrix); bool RayHit(struct KX_ClientObjectInfo *client, class KX_RayCast *result, float *oglmatrix);
/// \see KX_RayCast /// \see KX_RayCast
bool NeedRayCast(struct KX_ClientObjectInfo *, void *UNUSED(data)) { return true; } bool NeedRayCast(struct KX_ClientObjectInfo *, void *UNUSED(data)) { return true; }