1. Check material names passed to the physics engine (for collision sensors.)
Consider: gameobj->getClientInfo()->m_auxilary_info = (matname ? (void*)(matname+2) : NULL); It works if matname is "MAblah", but not if matname is "". 2. Added constructor for struct RAS_CameraData. 3. Added initializers to the struct KX_ClientObjectInfo constructor 4. Collision sensors won't detect near sensors. 5. A stack of minor tweaks, adjusting whitespace, using ++it for stl stuff.
This commit is contained in:
@@ -820,13 +820,9 @@ static KX_LightObject *gamelight_from_blamp(Lamp *la, unsigned int layerflag, KX
|
|||||||
}
|
}
|
||||||
|
|
||||||
static KX_Camera *gamecamera_from_bcamera(Camera *ca, KX_Scene *kxscene, KX_BlenderSceneConverter *converter) {
|
static KX_Camera *gamecamera_from_bcamera(Camera *ca, KX_Scene *kxscene, KX_BlenderSceneConverter *converter) {
|
||||||
RAS_CameraData camdata;
|
RAS_CameraData camdata(ca->lens, ca->clipsta, ca->clipend, ca->type == CAM_PERSP);
|
||||||
KX_Camera *gamecamera;
|
KX_Camera *gamecamera;
|
||||||
|
|
||||||
camdata.m_lens= ca->lens;
|
|
||||||
camdata.m_clipend= ca->clipend;
|
|
||||||
camdata.m_clipstart= ca->clipsta;
|
|
||||||
|
|
||||||
gamecamera= new KX_Camera(kxscene, KX_Scene::m_callbacks, camdata);
|
gamecamera= new KX_Camera(kxscene, KX_Scene::m_callbacks, camdata);
|
||||||
gamecamera->SetName(ca->id.name + 2);
|
gamecamera->SetName(ca->id.name + 2);
|
||||||
|
|
||||||
|
@@ -37,6 +37,7 @@ SOURCEDIR = source/gameengine/GamePlayer
|
|||||||
DIR = $(OCGDIR)/gameengine/GamePlayer
|
DIR = $(OCGDIR)/gameengine/GamePlayer
|
||||||
DIRS = common ghost
|
DIRS = common ghost
|
||||||
|
|
||||||
|
ifneq ($(NAN_NO_PLUGIN),true)
|
||||||
ifeq ($(OS),$(findstring $(OS), "freebsd irix windows"))
|
ifeq ($(OS),$(findstring $(OS), "freebsd irix windows"))
|
||||||
ifneq ($(FREE_WINDOWS),true)
|
ifneq ($(FREE_WINDOWS),true)
|
||||||
DIRS += netscape
|
DIRS += netscape
|
||||||
@@ -54,5 +55,6 @@ ifeq ($(OS),$(findstring $(OS), "solaris"))
|
|||||||
DIRS += netscape
|
DIRS += netscape
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
endif
|
||||||
|
|
||||||
include nan_subdirs.mk
|
include nan_subdirs.mk
|
||||||
|
@@ -118,7 +118,7 @@ int my_set_tpage(TFace *tface)
|
|||||||
unsigned int *rect, *bind;
|
unsigned int *rect, *bind;
|
||||||
int tpx, tpy, tilemode, tileXRep,tileYRep;
|
int tpx, tpy, tilemode, tileXRep,tileYRep;
|
||||||
|
|
||||||
/* afschakelen */
|
/* disable */
|
||||||
if(tface==0) {
|
if(tface==0) {
|
||||||
if(lasttface==0) return 0;
|
if(lasttface==0) return 0;
|
||||||
|
|
||||||
|
@@ -144,10 +144,10 @@ bool GPG_Application::startWindow(STR_String& title,
|
|||||||
//STR_String title ("Blender Player - GHOST");
|
//STR_String title ("Blender Player - GHOST");
|
||||||
m_mainWindow = fSystem->createWindow(title, windowLeft, windowTop, windowWidth, windowHeight, GHOST_kWindowStateNormal,
|
m_mainWindow = fSystem->createWindow(title, windowLeft, windowTop, windowWidth, windowHeight, GHOST_kWindowStateNormal,
|
||||||
GHOST_kDrawingContextTypeOpenGL, stereoVisual);
|
GHOST_kDrawingContextTypeOpenGL, stereoVisual);
|
||||||
if (!m_mainWindow) {
|
if (!m_mainWindow) {
|
||||||
printf("error: could not create main window\n");
|
printf("error: could not create main window\n");
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Check the size of the client rectangle of the window and resize the window
|
/* Check the size of the client rectangle of the window and resize the window
|
||||||
* so that the client rectangle has the size requested.
|
* so that the client rectangle has the size requested.
|
||||||
@@ -396,14 +396,14 @@ bool GPG_Application::startEngine(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Temporary hack to disable banner display for NaN approved content.
|
// Temporary hack to disable banner display for NaN approved content.
|
||||||
/*
|
|
||||||
m_canvas->SetBannerDisplayEnabled(true);
|
m_canvas->SetBannerDisplayEnabled(true);
|
||||||
Camera* cam;
|
/* Camera* cam;
|
||||||
cam = (Camera*)G.scene->camera->data;
|
cam = (Camera*)G.scene->camera->data;
|
||||||
if (cam) {
|
if (cam) {
|
||||||
if (((cam->flag) & 48)==48) {
|
if (((cam->flag) & 48)==48) {
|
||||||
m_canvas->SetBannerDisplayEnabled(false);
|
m_canvas->SetBannerDisplayEnabled(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
showError(CString("Camera data invalid."));
|
showError(CString("Camera data invalid."));
|
||||||
|
@@ -104,8 +104,8 @@ void usage(char* program)
|
|||||||
consoleoption = "";
|
consoleoption = "";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
printf("usage: %s -w [-p l t w h] %s[-g gamengineoptions] "
|
printf("usage: %s [-w [-p l t w h]] %s[-g gamengineoptions] "
|
||||||
"-s stereomode filename.blend\n", program, consoleoption);
|
"[-s stereomode] filename.blend\n", program, consoleoption);
|
||||||
printf(" -w: display in a window\n");
|
printf(" -w: display in a window\n");
|
||||||
printf(" -p: specify window position\n");
|
printf(" -p: specify window position\n");
|
||||||
printf(" l = window left coordinate\n");
|
printf(" l = window left coordinate\n");
|
||||||
|
@@ -37,7 +37,7 @@
|
|||||||
*/
|
*/
|
||||||
struct KX_ClientObjectInfo
|
struct KX_ClientObjectInfo
|
||||||
{
|
{
|
||||||
enum {
|
enum clienttype {
|
||||||
STATIC,
|
STATIC,
|
||||||
ACTOR,
|
ACTOR,
|
||||||
RESERVED1,
|
RESERVED1,
|
||||||
@@ -47,9 +47,13 @@ struct KX_ClientObjectInfo
|
|||||||
void* m_clientobject;
|
void* m_clientobject;
|
||||||
void* m_auxilary_info;
|
void* m_auxilary_info;
|
||||||
public:
|
public:
|
||||||
KX_ClientObjectInfo(void *clientobject) :
|
KX_ClientObjectInfo(void *clientobject, clienttype type = STATIC, void *auxilary_info = NULL) :
|
||||||
m_clientobject(clientobject)
|
m_type(type),
|
||||||
|
m_clientobject(clientobject),
|
||||||
|
m_auxilary_info(auxilary_info)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
bool isActor() { return m_type <= ACTOR; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //__KX_CLIENTOBJECT_INFO_H
|
#endif //__KX_CLIENTOBJECT_INFO_H
|
||||||
|
@@ -80,7 +80,7 @@
|
|||||||
GEN_Map<GEN_HashedPtr,DT_ShapeHandle> map_gamemesh_to_sumoshape;
|
GEN_Map<GEN_HashedPtr,DT_ShapeHandle> map_gamemesh_to_sumoshape;
|
||||||
|
|
||||||
// forward declarations
|
// forward declarations
|
||||||
void BL_RegisterSumoObject(KX_GameObject* gameobj,class SM_Scene* sumoScene,DT_SceneHandle solidscene,class SM_Object* sumoObj,const char* matname,bool isDynamic,bool isActor);
|
void BL_RegisterSumoObject(KX_GameObject* gameobj,class SM_Scene* sumoScene,DT_SceneHandle solidscene,class SM_Object* sumoObj,const STR_String& matname,bool isDynamic,bool isActor);
|
||||||
DT_ShapeHandle CreateShapeFromMesh(RAS_MeshObject* meshobj);
|
DT_ShapeHandle CreateShapeFromMesh(RAS_MeshObject* meshobj);
|
||||||
|
|
||||||
|
|
||||||
@@ -158,7 +158,7 @@ void KX_ConvertSumoObject( KX_GameObject* gameobj,
|
|||||||
sumoObj->setRigidBody(objprop->m_angular_rigidbody?true:false);
|
sumoObj->setRigidBody(objprop->m_angular_rigidbody?true:false);
|
||||||
|
|
||||||
objprop->m_isactor = objprop->m_dyna = true;
|
objprop->m_isactor = objprop->m_dyna = true;
|
||||||
BL_RegisterSumoObject(gameobj,sceneptr,sumoEnv->GetSolidScene(),sumoObj,NULL,true, true);
|
BL_RegisterSumoObject(gameobj,sceneptr,sumoEnv->GetSolidScene(),sumoObj,"",true, true);
|
||||||
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -229,7 +229,7 @@ void KX_ConvertSumoObject( KX_GameObject* gameobj,
|
|||||||
|
|
||||||
BL_RegisterSumoObject(gameobj,sceneptr,
|
BL_RegisterSumoObject(gameobj,sceneptr,
|
||||||
sumoEnv->GetSolidScene(),sumoObj,
|
sumoEnv->GetSolidScene(),sumoObj,
|
||||||
matname.ReadPtr(),
|
matname,
|
||||||
objprop->m_dyna,
|
objprop->m_dyna,
|
||||||
objprop->m_isactor);
|
objprop->m_isactor);
|
||||||
}
|
}
|
||||||
@@ -251,7 +251,15 @@ void KX_ConvertSumoObject( KX_GameObject* gameobj,
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void BL_RegisterSumoObject(KX_GameObject* gameobj,class SM_Scene* sumoScene,DT_SceneHandle solidscene,class SM_Object* sumoObj,const char* matname,bool isDynamic,bool isActor) {
|
void BL_RegisterSumoObject(
|
||||||
|
KX_GameObject* gameobj,
|
||||||
|
class SM_Scene* sumoScene,
|
||||||
|
DT_SceneHandle solidscene,
|
||||||
|
class SM_Object* sumoObj,
|
||||||
|
const STR_String& matname,
|
||||||
|
bool isDynamic,
|
||||||
|
bool isActor)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -274,7 +282,7 @@ void BL_RegisterSumoObject(KX_GameObject* gameobj,class SM_Scene* sumoScene,DT_S
|
|||||||
//gameobj->GetClientInfo()->m_clientobject = gameobj;
|
//gameobj->GetClientInfo()->m_clientobject = gameobj;
|
||||||
|
|
||||||
// store materialname in auxinfo, needed for touchsensors
|
// store materialname in auxinfo, needed for touchsensors
|
||||||
gameobj->getClientInfo()->m_auxilary_info = (matname? (void*)(matname+2) : NULL);
|
gameobj->getClientInfo()->m_auxilary_info = (matname.Length() ? (void*)(matname.ReadPtr()+2) : NULL);
|
||||||
|
|
||||||
physicscontroller->SetObject(gameobj->GetSGNode());
|
physicscontroller->SetObject(gameobj->GetSGNode());
|
||||||
|
|
||||||
|
@@ -73,8 +73,7 @@ KX_GameObject::KX_GameObject(
|
|||||||
m_pPhysicsController1(NULL)
|
m_pPhysicsController1(NULL)
|
||||||
{
|
{
|
||||||
m_ignore_activity_culling = false;
|
m_ignore_activity_culling = false;
|
||||||
m_pClient_info = new KX_ClientObjectInfo(this);
|
m_pClient_info = new KX_ClientObjectInfo(this, KX_ClientObjectInfo::ACTOR);
|
||||||
m_pClient_info->m_type = KX_ClientObjectInfo::ACTOR;
|
|
||||||
m_pSGNode = new SG_Node(this,sgReplicationInfo,callbacks);
|
m_pSGNode = new SG_Node(this,sgReplicationInfo,callbacks);
|
||||||
|
|
||||||
// define the relationship between this node and it's parent.
|
// define the relationship between this node and it's parent.
|
||||||
|
@@ -63,25 +63,25 @@ class KX_GameObject : public SCA_IObject
|
|||||||
{
|
{
|
||||||
Py_Header;
|
Py_Header;
|
||||||
|
|
||||||
bool m_bDyna;
|
bool m_bDyna;
|
||||||
KX_ClientObjectInfo* m_pClient_info;
|
KX_ClientObjectInfo* m_pClient_info;
|
||||||
STR_String m_name;
|
STR_String m_name;
|
||||||
STR_String m_text;
|
STR_String m_text;
|
||||||
std::vector<RAS_MeshObject*> m_meshes;
|
std::vector<RAS_MeshObject*> m_meshes;
|
||||||
|
|
||||||
bool m_bSuspendDynamics;
|
bool m_bSuspendDynamics;
|
||||||
bool m_bUseObjectColor;
|
bool m_bUseObjectColor;
|
||||||
MT_Vector4 m_objectColor;
|
MT_Vector4 m_objectColor;
|
||||||
|
|
||||||
// Is this object set to be visible? Only useful for the
|
// Is this object set to be visible? Only useful for the
|
||||||
// visibility subsystem right now.
|
// visibility subsystem right now.
|
||||||
bool m_bVisible;
|
bool m_bVisible;
|
||||||
|
|
||||||
KX_IPhysicsController* m_pPhysicsController1;
|
KX_IPhysicsController* m_pPhysicsController1;
|
||||||
SG_Node* m_pSGNode;
|
SG_Node* m_pSGNode;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
MT_CmMatrix4x4 m_OpenGL_4x4Matrix;
|
MT_CmMatrix4x4 m_OpenGL_4x4Matrix;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual void /* This function should be virtual - derived classed override it */
|
virtual void /* This function should be virtual - derived classed override it */
|
||||||
|
@@ -62,8 +62,7 @@ KX_NearSensor::KX_NearSensor(SCA_EventManager* eventmgr,
|
|||||||
m_ResetMargin(resetmargin)
|
m_ResetMargin(resetmargin)
|
||||||
|
|
||||||
{
|
{
|
||||||
m_client_info = new KX_ClientObjectInfo(gameobj);
|
m_client_info = new KX_ClientObjectInfo(gameobj, KX_ClientObjectInfo::NEAR);
|
||||||
m_client_info->m_type = KX_ClientObjectInfo::NEAR;
|
|
||||||
|
|
||||||
DT_ShapeHandle shape = (DT_ShapeHandle) vshape;
|
DT_ShapeHandle shape = (DT_ShapeHandle) vshape;
|
||||||
m_sumoObj = new SM_Object(shape,NULL,NULL,NULL);
|
m_sumoObj = new SM_Object(shape,NULL,NULL,NULL);
|
||||||
@@ -91,9 +90,7 @@ KX_NearSensor::KX_NearSensor(SCA_EventManager* eventmgr,
|
|||||||
m_ResetMargin(resetmargin)
|
m_ResetMargin(resetmargin)
|
||||||
|
|
||||||
{
|
{
|
||||||
m_client_info = new KX_ClientObjectInfo(gameobj);
|
m_client_info = new KX_ClientObjectInfo(gameobj, KX_ClientObjectInfo::NEAR);
|
||||||
m_client_info->m_type = KX_ClientObjectInfo::NEAR;
|
|
||||||
m_client_info->m_auxilary_info = NULL;
|
|
||||||
|
|
||||||
m_sumoObj = new SM_Object(DT_NewSphere(0.0),NULL,NULL,NULL);
|
m_sumoObj = new SM_Object(DT_NewSphere(0.0),NULL,NULL,NULL);
|
||||||
m_sumoObj->setMargin(m_Margin);
|
m_sumoObj->setMargin(m_Margin);
|
||||||
@@ -118,9 +115,7 @@ CValue* KX_NearSensor::GetReplica()
|
|||||||
// this will copy properties and so on...
|
// this will copy properties and so on...
|
||||||
CValue::AddDataToReplica(replica);
|
CValue::AddDataToReplica(replica);
|
||||||
|
|
||||||
replica->m_client_info = new KX_ClientObjectInfo(m_client_info->m_clientobject);
|
replica->m_client_info = new KX_ClientObjectInfo(m_client_info->m_clientobject, KX_ClientObjectInfo::NEAR);
|
||||||
replica->m_client_info->m_type = KX_ClientObjectInfo::NEAR;
|
|
||||||
replica->m_client_info->m_auxilary_info = NULL;
|
|
||||||
|
|
||||||
replica->m_sumoObj = new SM_Object(DT_NewSphere(0.0),NULL,NULL,NULL);
|
replica->m_sumoObj = new SM_Object(DT_NewSphere(0.0),NULL,NULL,NULL);
|
||||||
replica->m_sumoObj->setMargin(m_Margin);
|
replica->m_sumoObj->setMargin(m_Margin);
|
||||||
|
@@ -119,6 +119,19 @@ KX_TouchSensor::~KX_TouchSensor()
|
|||||||
m_colliders->Release();
|
m_colliders->Release();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CValue* KX_TouchSensor::GetReplica()
|
||||||
|
{
|
||||||
|
KX_TouchSensor* replica = new KX_TouchSensor(*this);
|
||||||
|
replica->m_colliders = new CListValue();
|
||||||
|
replica->m_bCollision = false;
|
||||||
|
replica->m_bTriggered= false;
|
||||||
|
replica->m_hitObject = NULL;
|
||||||
|
replica->m_bLastTriggered = false;
|
||||||
|
// this will copy properties and so on...
|
||||||
|
CValue::AddDataToReplica(replica);
|
||||||
|
return replica;
|
||||||
|
}
|
||||||
|
|
||||||
void KX_TouchSensor::ReParent(SCA_IObject* parent)
|
void KX_TouchSensor::ReParent(SCA_IObject* parent)
|
||||||
{
|
{
|
||||||
KX_GameObject *gameobj = static_cast<KX_GameObject *>(parent);
|
KX_GameObject *gameobj = static_cast<KX_GameObject *>(parent);
|
||||||
@@ -159,7 +172,7 @@ DT_Bool KX_TouchSensor::HandleCollision(void* obj1,void* obj2,const DT_CollDa
|
|||||||
(KX_GameObject*)client_info->m_clientobject :
|
(KX_GameObject*)client_info->m_clientobject :
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
if (gameobj && (gameobj != parent))
|
if (gameobj && (gameobj != parent) && client_info->isActor())
|
||||||
{
|
{
|
||||||
if (!m_colliders->SearchValue(gameobj))
|
if (!m_colliders->SearchValue(gameobj))
|
||||||
m_colliders->Add(gameobj->AddRef());
|
m_colliders->Add(gameobj->AddRef());
|
||||||
@@ -171,14 +184,8 @@ DT_Bool KX_TouchSensor::HandleCollision(void* obj1,void* obj2,const DT_CollDa
|
|||||||
{
|
{
|
||||||
if (client_info->m_auxilary_info)
|
if (client_info->m_auxilary_info)
|
||||||
{
|
{
|
||||||
found = (m_touchedpropname == ((char*)client_info->m_auxilary_info));
|
found = (m_touchedpropname == STR_String((char*)client_info->m_auxilary_info));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (found)
|
|
||||||
{
|
|
||||||
int i=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
found = (gameobj->GetProperty(m_touchedpropname) != NULL);
|
found = (gameobj->GetProperty(m_touchedpropname) != NULL);
|
||||||
|
@@ -77,17 +77,7 @@ public:
|
|||||||
PyTypeObject* T=&Type) ;
|
PyTypeObject* T=&Type) ;
|
||||||
virtual ~KX_TouchSensor();
|
virtual ~KX_TouchSensor();
|
||||||
|
|
||||||
virtual CValue* GetReplica() {
|
virtual CValue* GetReplica();
|
||||||
KX_TouchSensor* replica = new KX_TouchSensor(*this);
|
|
||||||
replica->m_colliders = new CListValue();
|
|
||||||
replica->m_bCollision = false;
|
|
||||||
replica->m_bTriggered= false;
|
|
||||||
replica->m_hitObject = NULL;
|
|
||||||
replica->m_bLastTriggered = false;
|
|
||||||
// this will copy properties and so on...
|
|
||||||
CValue::AddDataToReplica(replica);
|
|
||||||
return replica;
|
|
||||||
};
|
|
||||||
virtual void SynchronizeTransform();
|
virtual void SynchronizeTransform();
|
||||||
virtual bool Evaluate(CValue* event);
|
virtual bool Evaluate(CValue* event);
|
||||||
virtual void ReParent(SCA_IObject* parent);
|
virtual void ReParent(SCA_IObject* parent);
|
||||||
|
@@ -92,7 +92,7 @@ vector<NG_NetworkMessage*> NG_LoopBackNetworkDeviceInterface::RetrieveNetworkMes
|
|||||||
vector<NG_NetworkMessage*> messages;
|
vector<NG_NetworkMessage*> messages;
|
||||||
|
|
||||||
std::deque<NG_NetworkMessage*>::iterator mesit=m_messages[m_currentQueue].begin();
|
std::deque<NG_NetworkMessage*>::iterator mesit=m_messages[m_currentQueue].begin();
|
||||||
for (; !(mesit == m_messages[m_currentQueue].end());mesit++)
|
for (; !(mesit == m_messages[m_currentQueue].end()); ++mesit)
|
||||||
{
|
{
|
||||||
|
|
||||||
// We don't increase the reference count for these messages. We
|
// We don't increase the reference count for these messages. We
|
||||||
|
@@ -374,6 +374,8 @@ DT_Bool SM_Object::boing(
|
|||||||
if (obj2->isDynamic())
|
if (obj2->isDynamic())
|
||||||
obj2->dynamicCollision(local2, -normal, dist, -rel_vel, restitution, friction_factor, invMass);
|
obj2->dynamicCollision(local2, -normal, dist, -rel_vel, restitution, friction_factor, invMass);
|
||||||
|
|
||||||
|
//fix(client_data, (void*) obj1, (void*) obj2, coll_data);
|
||||||
|
|
||||||
return DT_CONTINUE;
|
return DT_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -411,6 +413,9 @@ DT_Bool SM_Object::fix(
|
|||||||
MT_Point3 local1(p1), local2(p2);
|
MT_Point3 local1(p1), local2(p2);
|
||||||
// Get collision data from SOLID
|
// Get collision data from SOLID
|
||||||
MT_Vector3 normal(local2 - local1);
|
MT_Vector3 normal(local2 - local1);
|
||||||
|
|
||||||
|
if (normal.dot(normal) < MT_EPSILON)
|
||||||
|
return DT_CONTINUE;
|
||||||
|
|
||||||
// This distinction between dynamic and non-dynamic objects should not be
|
// This distinction between dynamic and non-dynamic objects should not be
|
||||||
// necessary. Non-dynamic objects are assumed to have infinite mass.
|
// necessary. Non-dynamic objects are assumed to have infinite mass.
|
||||||
@@ -439,7 +444,7 @@ DT_Bool SM_Object::fix(
|
|||||||
MT_Scalar rel_vel_normal = -0.99*(normal.dot(rel_vel));
|
MT_Scalar rel_vel_normal = -0.99*(normal.dot(rel_vel));
|
||||||
|
|
||||||
obj2->addLinearVelocity(rel_vel_normal*normal);
|
obj2->addLinearVelocity(rel_vel_normal*normal);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return DT_CONTINUE;
|
return DT_CONTINUE;
|
||||||
@@ -461,9 +466,34 @@ void SM_Object::relax(void)
|
|||||||
notifyClient();
|
notifyClient();
|
||||||
}
|
}
|
||||||
|
|
||||||
SM_Object::SM_Object(
|
SM_Object::SM_Object() :
|
||||||
) {
|
m_dynamicParent(0),
|
||||||
|
m_client_object(0),
|
||||||
|
|
||||||
|
m_shape(0),
|
||||||
|
m_materialProps(0),
|
||||||
|
m_materialPropsBackup(0),
|
||||||
|
m_shapeProps(0),
|
||||||
|
m_shapePropsBackup(0),
|
||||||
|
m_object(0),
|
||||||
|
m_margin(0.0),
|
||||||
|
m_scaling(1.0, 1.0, 1.0),
|
||||||
|
m_reaction_impulse(0.0, 0.0, 0.0),
|
||||||
|
m_reaction_force(0.0, 0.0, 0.0),
|
||||||
|
m_kinematic(false),
|
||||||
|
m_prev_kinematic(false),
|
||||||
|
m_is_rigid_body(false),
|
||||||
|
m_lin_mom(0.0, 0.0, 0.0),
|
||||||
|
m_ang_mom(0.0, 0.0, 0.0),
|
||||||
|
m_force(0.0, 0.0, 0.0),
|
||||||
|
m_torque(0.0, 0.0, 0.0),
|
||||||
|
m_error(0.0, 0.0, 0.0),
|
||||||
|
m_combined_lin_vel (0.0, 0.0, 0.0),
|
||||||
|
m_combined_ang_vel (0.0, 0.0, 0.0),
|
||||||
|
m_fh_object(0)
|
||||||
|
{
|
||||||
// warning no initialization of variables done by moto.
|
// warning no initialization of variables done by moto.
|
||||||
|
std::cout << "SM_Object::SM_Object()" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
SM_Object::
|
SM_Object::
|
||||||
|
@@ -162,8 +162,8 @@ void SM_Scene::remove(SM_Object& object) {
|
|||||||
|
|
||||||
void SM_Scene::proceed(MT_Scalar timeStep, MT_Scalar subSampling) {
|
void SM_Scene::proceed(MT_Scalar timeStep, MT_Scalar subSampling) {
|
||||||
// Don't waste time...but it's OK to spill a little.
|
// Don't waste time...but it's OK to spill a little.
|
||||||
if (timeStep < 0.001)
|
//if (timeStep < 0.001)
|
||||||
return;
|
// return;
|
||||||
|
|
||||||
// Divide the timeStep into a number of subsamples of size roughly
|
// Divide the timeStep into a number of subsamples of size roughly
|
||||||
// equal to subSampling (might be a little smaller).
|
// equal to subSampling (might be a little smaller).
|
||||||
@@ -208,14 +208,16 @@ void SM_Scene::proceed(MT_Scalar timeStep, MT_Scalar subSampling) {
|
|||||||
#if 0
|
#if 0
|
||||||
clearObjectCombinedVelocities();
|
clearObjectCombinedVelocities();
|
||||||
#endif
|
#endif
|
||||||
if (DT_Test(m_scene, m_fixRespTable))
|
/* if (DT_Test(m_scene, m_fixRespTable))
|
||||||
for (i = m_objectList.begin(); i != m_objectList.end(); ++i)
|
for (i = m_objectList.begin(); i != m_objectList.end(); ++i)
|
||||||
(*i)->relax();
|
(*i)->relax(); */
|
||||||
|
DT_Test(m_scene, m_fixRespTable);
|
||||||
|
|
||||||
// Finish this timestep by saving al state information for the next
|
// Finish this timestep by saving al state information for the next
|
||||||
// timestep and clearing the accumulated forces.
|
// timestep and clearing the accumulated forces.
|
||||||
|
|
||||||
for (i = m_objectList.begin(); i != m_objectList.end(); ++i) {
|
for (i = m_objectList.begin(); i != m_objectList.end(); ++i) {
|
||||||
|
(*i)->relax();
|
||||||
(*i)->proceedKinematic(timeStep);
|
(*i)->proceedKinematic(timeStep);
|
||||||
(*i)->saveReactionForce(timeStep);
|
(*i)->saveReactionForce(timeStep);
|
||||||
(*i)->clearForce();
|
(*i)->clearForce();
|
||||||
|
@@ -71,6 +71,7 @@ SumoPhysicsController::~SumoPhysicsController()
|
|||||||
m_sumoScene->remove(*m_sumoObj);
|
m_sumoScene->remove(*m_sumoObj);
|
||||||
|
|
||||||
delete m_sumoObj;
|
delete m_sumoObj;
|
||||||
|
m_sumoObj = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -56,6 +56,7 @@ SumoPhysicsEnvironment::SumoPhysicsEnvironment()
|
|||||||
|
|
||||||
SumoPhysicsEnvironment::~SumoPhysicsEnvironment()
|
SumoPhysicsEnvironment::~SumoPhysicsEnvironment()
|
||||||
{
|
{
|
||||||
|
std::cout << "delete m_sumoScene " << m_sumoScene << std::endl;
|
||||||
delete m_sumoScene;
|
delete m_sumoScene;
|
||||||
DT_DestroyScene(m_solidScene);
|
DT_DestroyScene(m_solidScene);
|
||||||
//DT_DestroyRespTable(m_respTable);
|
//DT_DestroyRespTable(m_respTable);
|
||||||
|
@@ -1,196 +0,0 @@
|
|||||||
#ifndef SOLID_H
|
|
||||||
#define SOLID_H
|
|
||||||
|
|
||||||
#include "solid_types.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
DT_DECLARE_HANDLE(DT_ObjectHandle);
|
|
||||||
DT_DECLARE_HANDLE(DT_SceneHandle);
|
|
||||||
DT_DECLARE_HANDLE(DT_ShapeHandle);
|
|
||||||
DT_DECLARE_HANDLE(DT_RespTableHandle);
|
|
||||||
|
|
||||||
typedef enum DT_ScalarType {
|
|
||||||
DT_FLOAT,
|
|
||||||
DT_DOUBLE
|
|
||||||
} DT_ScalarType;
|
|
||||||
|
|
||||||
typedef enum DT_ResponseType {
|
|
||||||
DT_NO_RESPONSE,
|
|
||||||
DT_SIMPLE_RESPONSE,
|
|
||||||
DT_WITNESSED_RESPONSE,
|
|
||||||
DT_DEPTH_RESPONSE,
|
|
||||||
} DT_ResponseType;
|
|
||||||
|
|
||||||
typedef struct DT_CollData {
|
|
||||||
DT_Vector3 point1;
|
|
||||||
DT_Vector3 point2;
|
|
||||||
DT_Vector3 normal;
|
|
||||||
} DT_CollData;
|
|
||||||
|
|
||||||
typedef void (*DT_ResponseCallback)(
|
|
||||||
void *client_data,
|
|
||||||
void *client_object1,
|
|
||||||
void *client_object2,
|
|
||||||
const DT_CollData *coll_data);
|
|
||||||
|
|
||||||
/* Shape definition, similar to OpenGL */
|
|
||||||
|
|
||||||
extern DT_ShapeHandle DT_Box(DT_Scalar x, DT_Scalar y, DT_Scalar z);
|
|
||||||
extern DT_ShapeHandle DT_Cone(DT_Scalar radius, DT_Scalar height);
|
|
||||||
extern DT_ShapeHandle DT_Cylinder(DT_Scalar radius, DT_Scalar height);
|
|
||||||
extern DT_ShapeHandle DT_Sphere(DT_Scalar radius);
|
|
||||||
extern DT_ShapeHandle DT_Ray(DT_Scalar x, DT_Scalar y, DT_Scalar z);
|
|
||||||
|
|
||||||
extern DT_ShapeHandle DT_NewComplexShape();
|
|
||||||
extern void DT_EndComplexShape();
|
|
||||||
|
|
||||||
extern DT_ShapeHandle DT_NewPolyhedron();
|
|
||||||
extern void DT_EndPolyhedron();
|
|
||||||
|
|
||||||
extern void DT_Begin();
|
|
||||||
extern void DT_End();
|
|
||||||
|
|
||||||
extern void DT_Vertex(DT_Scalar x, DT_Scalar y, DT_Scalar z);
|
|
||||||
|
|
||||||
/* Vertex arrays maintained by the client application can be accessed directly
|
|
||||||
by SUMO. For instance, you have a vertex struct in the client of the form:
|
|
||||||
|
|
||||||
struct Vertex {
|
|
||||||
float xyz[3];
|
|
||||||
float uv[2];
|
|
||||||
float normal[3];
|
|
||||||
};
|
|
||||||
|
|
||||||
And maintain vertex arrays e.g. as
|
|
||||||
|
|
||||||
struct Vertex vertices[328];
|
|
||||||
|
|
||||||
Within a Polyhedron or a ComplexShape you can use this data by specifying
|
|
||||||
|
|
||||||
DT_VertexBase(vertices, DT_FLOAT, sizeof(struct Vertex));
|
|
||||||
|
|
||||||
and refer to vertices in the array using
|
|
||||||
|
|
||||||
DT_VertexIndex(10);
|
|
||||||
|
|
||||||
or
|
|
||||||
|
|
||||||
DT_Index indices[5] = { 6, 4, 8, 1, 3 };
|
|
||||||
DT_VertexIndices(5, indices);
|
|
||||||
|
|
||||||
or even
|
|
||||||
|
|
||||||
DT_VertexRange(8, 4);
|
|
||||||
|
|
||||||
for the range 8, 9, 10, 11.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
extern void DT_SetVertexBase(const void *base, DT_ScalarType type,
|
|
||||||
DT_Size stride);
|
|
||||||
extern void DT_VertexIndex(DT_Index index);
|
|
||||||
extern void DT_VertexIndices(DT_Count count, const DT_Index *indices);
|
|
||||||
extern void DT_VertexRange(DT_Index first, DT_Count count);
|
|
||||||
|
|
||||||
|
|
||||||
/* currently not implemented */
|
|
||||||
extern void DT_ChangeVertexBase(DT_ShapeHandle shape, const void *base);
|
|
||||||
|
|
||||||
extern void DT_DeleteShape(DT_ShapeHandle shape);
|
|
||||||
|
|
||||||
/* Scene */
|
|
||||||
|
|
||||||
extern DT_SceneHandle DT_CreateScene();
|
|
||||||
extern void DT_DeleteScene(DT_SceneHandle scene);
|
|
||||||
|
|
||||||
extern void DT_AddObject(DT_SceneHandle scene, DT_ObjectHandle object);
|
|
||||||
extern void DT_RemoveObject(DT_SceneHandle scene, DT_ObjectHandle object);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Object */
|
|
||||||
|
|
||||||
extern DT_ObjectHandle DT_CreateObject(
|
|
||||||
void *client_object, /* pointer to object in client memory */
|
|
||||||
DT_ShapeHandle shape /* the shape or geometry of the object */
|
|
||||||
);
|
|
||||||
|
|
||||||
extern void DT_DeleteObject(DT_ObjectHandle object);
|
|
||||||
|
|
||||||
extern void DT_SetScaling(DT_ObjectHandle object, const DT_Vector3 scaling);
|
|
||||||
extern void DT_SetPosition(DT_ObjectHandle object, const DT_Vector3 position);
|
|
||||||
extern void DT_SetOrientation(DT_ObjectHandle object, const DT_Quaternion orientation);
|
|
||||||
|
|
||||||
extern void DT_SetMargin(DT_ObjectHandle object, DT_Scalar margin);
|
|
||||||
|
|
||||||
extern void DT_SetMatrixf(DT_ObjectHandle object, const float *m);
|
|
||||||
extern void DT_GetMatrixf(DT_ObjectHandle object, float *m);
|
|
||||||
|
|
||||||
extern void DT_SetMatrixd(DT_ObjectHandle object, const double *m);
|
|
||||||
extern void DT_GetMatrixd(DT_ObjectHandle object, double *m);
|
|
||||||
|
|
||||||
extern void DT_GetWorldCoord(DT_ObjectHandle object,
|
|
||||||
const DT_Vector3 local,
|
|
||||||
DT_Vector3 world);
|
|
||||||
|
|
||||||
extern DT_Scalar DT_GetClosestPair(DT_ObjectHandle object1, DT_ObjectHandle object2,
|
|
||||||
DT_Vector3 point1, DT_Vector3 point2);
|
|
||||||
|
|
||||||
|
|
||||||
/* Response, see SOLID user manual */
|
|
||||||
|
|
||||||
extern DT_RespTableHandle DT_CreateRespTable();
|
|
||||||
extern void DT_DeleteRespTable(DT_RespTableHandle respTable);
|
|
||||||
|
|
||||||
extern void DT_CallResponse(DT_RespTableHandle respTable,
|
|
||||||
DT_ObjectHandle object1,
|
|
||||||
DT_ObjectHandle object2,
|
|
||||||
const DT_CollData *coll_data);
|
|
||||||
|
|
||||||
extern void DT_SetDefaultResponse(DT_RespTableHandle respTable,
|
|
||||||
DT_ResponseCallback response,
|
|
||||||
DT_ResponseType type,
|
|
||||||
void *client_data);
|
|
||||||
|
|
||||||
extern void DT_ClearDefaultResponse(DT_RespTableHandle respTable);
|
|
||||||
|
|
||||||
extern void DT_SetObjectResponse(DT_RespTableHandle respTable,
|
|
||||||
DT_ObjectHandle object,
|
|
||||||
DT_ResponseCallback response,
|
|
||||||
DT_ResponseType type, void *client_data);
|
|
||||||
extern void DT_ClearObjectResponse(DT_RespTableHandle respTable,
|
|
||||||
DT_ObjectHandle object);
|
|
||||||
|
|
||||||
extern void DT_SetPairResponse(DT_RespTableHandle respTable,
|
|
||||||
DT_ObjectHandle object1,
|
|
||||||
DT_ObjectHandle object2,
|
|
||||||
DT_ResponseCallback response,
|
|
||||||
DT_ResponseType type,
|
|
||||||
void *client_data);
|
|
||||||
extern void DT_ClearPairResponse(DT_RespTableHandle respTable,
|
|
||||||
DT_ObjectHandle object1,
|
|
||||||
DT_ObjectHandle object2);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Perform a collision test for a given scene, using a response table */
|
|
||||||
|
|
||||||
extern DT_Count DT_Test(DT_SceneHandle scene, DT_RespTableHandle respTable);
|
|
||||||
|
|
||||||
extern void *DT_RayTest(DT_SceneHandle scene, void *ignore_client,
|
|
||||||
const DT_Vector3 from, const DT_Vector3 to,
|
|
||||||
DT_Vector3 spot, DT_Vector3 normal);
|
|
||||||
|
|
||||||
extern int DT_ObjectRayTest(DT_ObjectHandle object,
|
|
||||||
const DT_Vector3 from, const DT_Vector3 to,
|
|
||||||
DT_Vector3 spot, DT_Vector3 normal);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@@ -1,39 +0,0 @@
|
|||||||
#ifndef SOLID_BROADPHASE_H
|
|
||||||
#define SOLID_BROADPHASE_H
|
|
||||||
|
|
||||||
#include "solid_types.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
DT_DECLARE_HANDLE(BP_SceneHandle);
|
|
||||||
DT_DECLARE_HANDLE(BP_ProxyHandle);
|
|
||||||
|
|
||||||
typedef void (*BP_Callback)(void *client_data,
|
|
||||||
void *object1,
|
|
||||||
void *object2);
|
|
||||||
|
|
||||||
extern BP_SceneHandle BP_CreateScene(void *client_data,
|
|
||||||
BP_Callback beginOverlap,
|
|
||||||
BP_Callback endOverlap);
|
|
||||||
|
|
||||||
extern void BP_DeleteScene(BP_SceneHandle scene);
|
|
||||||
|
|
||||||
extern BP_ProxyHandle BP_CreateProxy(BP_SceneHandle scene, void *object,
|
|
||||||
const DT_Vector3 lower,
|
|
||||||
const DT_Vector3 upper);
|
|
||||||
|
|
||||||
extern void BP_DeleteProxy(BP_SceneHandle scene,
|
|
||||||
BP_ProxyHandle proxy);
|
|
||||||
|
|
||||||
extern void BP_SetBBox(BP_ProxyHandle proxy,
|
|
||||||
const DT_Vector3 lower,
|
|
||||||
const DT_Vector3 upper);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@@ -1,15 +0,0 @@
|
|||||||
#ifndef SOLID_TYPES_H
|
|
||||||
#define SOLID_TYPES_H
|
|
||||||
|
|
||||||
#define DT_DECLARE_HANDLE(name) typedef struct name##__ { int unused; } *name
|
|
||||||
|
|
||||||
typedef double DT_Scalar;
|
|
||||||
typedef unsigned int DT_Count;
|
|
||||||
typedef unsigned int DT_Index;
|
|
||||||
typedef unsigned int DT_Size;
|
|
||||||
|
|
||||||
typedef DT_Scalar DT_Vector3[3];
|
|
||||||
typedef DT_Scalar DT_Quaternion[4];
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
@@ -37,6 +37,15 @@ struct RAS_CameraData
|
|||||||
float m_lens;
|
float m_lens;
|
||||||
float m_clipstart;
|
float m_clipstart;
|
||||||
float m_clipend;
|
float m_clipend;
|
||||||
|
bool m_perspective;
|
||||||
|
|
||||||
|
RAS_CameraData(float lens = 35., float clipstart = 0.1, float clipend = 100., bool perspective = true) :
|
||||||
|
m_lens(lens),
|
||||||
|
m_clipstart(clipstart),
|
||||||
|
m_clipend(clipend),
|
||||||
|
m_perspective(perspective)
|
||||||
|
{
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //__RAS_CAMERADATA_H
|
#endif //__RAS_CAMERADATA_H
|
||||||
|
@@ -94,8 +94,12 @@ public:
|
|||||||
virtual void ClearDepthBuffer()=0;
|
virtual void ClearDepthBuffer()=0;
|
||||||
virtual void ClearCachingInfo(void)=0;
|
virtual void ClearCachingInfo(void)=0;
|
||||||
virtual void EndFrame()=0;
|
virtual void EndFrame()=0;
|
||||||
|
/**
|
||||||
|
* SetRenderArea sets the render area in the 2d canvas
|
||||||
|
*/
|
||||||
virtual void SetRenderArea()=0;
|
virtual void SetRenderArea()=0;
|
||||||
|
|
||||||
|
// Stereo Functions
|
||||||
virtual void SetStereoMode(const int stereomode)=0;
|
virtual void SetStereoMode(const int stereomode)=0;
|
||||||
virtual bool Stereo()=0;
|
virtual bool Stereo()=0;
|
||||||
virtual void SetEye(const int eye)=0;
|
virtual void SetEye(const int eye)=0;
|
||||||
@@ -103,6 +107,20 @@ public:
|
|||||||
virtual void SetFocalLength(const float focallength)=0;
|
virtual void SetFocalLength(const float focallength)=0;
|
||||||
|
|
||||||
virtual void SwapBuffers()=0;
|
virtual void SwapBuffers()=0;
|
||||||
|
|
||||||
|
// Drawing Functions
|
||||||
|
/**
|
||||||
|
* IndexPrimitives: Renders primitives.
|
||||||
|
* @param vertexarrays is an array of vertex arrays
|
||||||
|
* @param indexarrays is an array of index arrays
|
||||||
|
* @param mode determines the type of primitive stored in the vertex/index arrays:
|
||||||
|
* 0 triangles
|
||||||
|
* 1 lines (default)
|
||||||
|
* 2 quads
|
||||||
|
* @param polymat (reserved)
|
||||||
|
* @param useObjectColor will render the object using @param rgbacolor instead of
|
||||||
|
* vertex colours.
|
||||||
|
*/
|
||||||
virtual void IndexPrimitives( const vecVertexArray& vertexarrays,
|
virtual void IndexPrimitives( const vecVertexArray& vertexarrays,
|
||||||
const vecIndexArrays & indexarrays,
|
const vecIndexArrays & indexarrays,
|
||||||
int mode,
|
int mode,
|
||||||
@@ -110,6 +128,10 @@ public:
|
|||||||
class RAS_IRenderTools* rendertools,
|
class RAS_IRenderTools* rendertools,
|
||||||
bool useObjectColor,
|
bool useObjectColor,
|
||||||
const MT_Vector4& rgbacolor)=0;
|
const MT_Vector4& rgbacolor)=0;
|
||||||
|
/**
|
||||||
|
* IndexPrimitivesEx: See IndexPrimitives.
|
||||||
|
* IndexPrimitivesEx will renormalize faces if @param vertexarrays[i].getFlag() & TV_CALCFACENORMAL
|
||||||
|
*/
|
||||||
virtual void IndexPrimitives_Ex( const vecVertexArray& vertexarrays,
|
virtual void IndexPrimitives_Ex( const vecVertexArray& vertexarrays,
|
||||||
const vecIndexArrays & indexarrays,
|
const vecIndexArrays & indexarrays,
|
||||||
int mode,
|
int mode,
|
||||||
@@ -117,6 +139,10 @@ public:
|
|||||||
class RAS_IRenderTools* rendertools,
|
class RAS_IRenderTools* rendertools,
|
||||||
bool useObjectColor,
|
bool useObjectColor,
|
||||||
const MT_Vector4& rgbacolor)=0;
|
const MT_Vector4& rgbacolor)=0;
|
||||||
|
/**
|
||||||
|
* IndexPrimitives_3DText will render text into the polygons.
|
||||||
|
* The text to be rendered is from @param rendertools client object's text property.
|
||||||
|
*/
|
||||||
virtual void IndexPrimitives_3DText( const vecVertexArray& vertexarrays,
|
virtual void IndexPrimitives_3DText( const vecVertexArray& vertexarrays,
|
||||||
const vecIndexArrays & indexarrays,
|
const vecIndexArrays & indexarrays,
|
||||||
int mode,
|
int mode,
|
||||||
@@ -161,12 +187,18 @@ public:
|
|||||||
float blue,
|
float blue,
|
||||||
float alpha)=0;
|
float alpha)=0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param drawingmode = KX_BOUNDINGBOX, KX_WIREFRAME, KX_SOLID, KX_SHADED or KX_TEXTURED.
|
||||||
|
*/
|
||||||
virtual void SetDrawingMode(int drawingmode)=0;
|
virtual void SetDrawingMode(int drawingmode)=0;
|
||||||
virtual int GetDrawingMode()=0;
|
virtual int GetDrawingMode()=0;
|
||||||
|
|
||||||
virtual void EnableTextures(bool enable)=0;
|
virtual void EnableTextures(bool enable)=0;
|
||||||
|
|
||||||
virtual void SetCullFace(bool enable)=0;
|
virtual void SetCullFace(bool enable)=0;
|
||||||
|
/**
|
||||||
|
* Sets wireframe mode.
|
||||||
|
*/
|
||||||
virtual void SetLines(bool enable)=0;
|
virtual void SetLines(bool enable)=0;
|
||||||
|
|
||||||
virtual double GetTime()=0;
|
virtual double GetTime()=0;
|
||||||
@@ -177,7 +209,8 @@ public:
|
|||||||
float bottom,
|
float bottom,
|
||||||
float top,
|
float top,
|
||||||
float frustnear,
|
float frustnear,
|
||||||
float frustfar
|
float frustfar,
|
||||||
|
bool perspective = true
|
||||||
)=0;
|
)=0;
|
||||||
|
|
||||||
virtual void SetSpecularity(float specX,
|
virtual void SetSpecularity(float specX,
|
||||||
|
@@ -68,7 +68,7 @@ RAS_OpenGLRasterizer::~RAS_OpenGLRasterizer()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
void Myinit_gl_stuff(void)
|
static void Myinit_gl_stuff(void)
|
||||||
{
|
{
|
||||||
float mat_specular[] = { 0.5, 0.5, 0.5, 1.0 };
|
float mat_specular[] = { 0.5, 0.5, 0.5, 1.0 };
|
||||||
float mat_shininess[] = { 35.0 };
|
float mat_shininess[] = { 35.0 };
|
||||||
@@ -259,7 +259,7 @@ void RAS_OpenGLRasterizer::Exit()
|
|||||||
glClearDepth(1.0);
|
glClearDepth(1.0);
|
||||||
glClearColor(m_redback, m_greenback, m_blueback, m_alphaback);
|
glClearColor(m_redback, m_greenback, m_blueback, m_alphaback);
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
glDepthMask (GL_TRUE);
|
glDepthMask (GL_TRUE);
|
||||||
glDepthFunc(GL_LEQUAL);
|
glDepthFunc(GL_LEQUAL);
|
||||||
glBlendFunc(GL_ONE, GL_ZERO);
|
glBlendFunc(GL_ONE, GL_ZERO);
|
||||||
|
|
||||||
@@ -292,7 +292,7 @@ bool RAS_OpenGLRasterizer::BeginFrame(int drawingmode, double time)
|
|||||||
|
|
||||||
glShadeModel(GL_SMOOTH);
|
glShadeModel(GL_SMOOTH);
|
||||||
|
|
||||||
m_2DCanvas->BeginFrame();
|
m_2DCanvas->BeginFrame();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1083,7 +1083,8 @@ MT_Matrix4x4 RAS_OpenGLRasterizer::GetFrustumMatrix(
|
|||||||
float bottom,
|
float bottom,
|
||||||
float top,
|
float top,
|
||||||
float frustnear,
|
float frustnear,
|
||||||
float frustfar
|
float frustfar,
|
||||||
|
bool perspective
|
||||||
){
|
){
|
||||||
MT_Matrix4x4 result;
|
MT_Matrix4x4 result;
|
||||||
double mat[16];
|
double mat[16];
|
||||||
@@ -1110,10 +1111,11 @@ MT_Matrix4x4 RAS_OpenGLRasterizer::GetFrustumMatrix(
|
|||||||
}
|
}
|
||||||
// leave bottom, top, bottom and top untouched
|
// leave bottom, top, bottom and top untouched
|
||||||
}
|
}
|
||||||
|
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
glFrustum(left, right, bottom, top, frustnear, frustfar);
|
glFrustum(left, right, bottom, top, frustnear, frustfar);
|
||||||
|
|
||||||
glGetDoublev(GL_PROJECTION_MATRIX, mat);
|
glGetDoublev(GL_PROJECTION_MATRIX, mat);
|
||||||
result.setValue(mat);
|
result.setValue(mat);
|
||||||
|
|
||||||
|
@@ -203,7 +203,8 @@ public:
|
|||||||
float bottom,
|
float bottom,
|
||||||
float top,
|
float top,
|
||||||
float frustnear,
|
float frustnear,
|
||||||
float frustfar
|
float frustfar,
|
||||||
|
bool perspective
|
||||||
);
|
);
|
||||||
|
|
||||||
virtual void SetSpecularity(
|
virtual void SetSpecularity(
|
||||||
|
@@ -73,10 +73,6 @@ bool RAS_VAOpenGLRasterizer::Init(void)
|
|||||||
|
|
||||||
if (result)
|
if (result)
|
||||||
{
|
{
|
||||||
// if possible, add extensions to other platforms too, if this
|
|
||||||
// rasterizer becomes messy just derive one for each platform
|
|
||||||
// (ie. KX_Win32Rasterizer, KX_LinuxRasterizer etc.)
|
|
||||||
|
|
||||||
glEnableClientState(GL_VERTEX_ARRAY);
|
glEnableClientState(GL_VERTEX_ARRAY);
|
||||||
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
|
||||||
glDisableClientState(GL_NORMAL_ARRAY);
|
glDisableClientState(GL_NORMAL_ARRAY);
|
||||||
@@ -187,6 +183,17 @@ void RAS_VAOpenGLRasterizer::IndexPrimitives( const vecVertexArray& vertexarrays
|
|||||||
glColor3d(0,0,0);
|
glColor3d(0,0,0);
|
||||||
}
|
}
|
||||||
// use glDrawElements to draw each vertexarray
|
// use glDrawElements to draw each vertexarray
|
||||||
|
static bool doWarning = true;
|
||||||
|
if (vertexarrays.size() > 1 && doWarning)
|
||||||
|
{
|
||||||
|
/* TODO: if vertexarrays.size() == 1 then if we are multitexturing
|
||||||
|
we can glLockArraysEXT the vertex arrays - GL will be able to cache
|
||||||
|
the vertex transforms. */
|
||||||
|
std::cout << "# vertex arrays: " << vertexarrays.size() << std::endl;
|
||||||
|
std::cout << "I wondered if this could happen: please inform the proper authorities." << std::endl;
|
||||||
|
doWarning = false;
|
||||||
|
}
|
||||||
|
|
||||||
for (vt=0;vt<vertexarrays.size();vt++)
|
for (vt=0;vt<vertexarrays.size();vt++)
|
||||||
{
|
{
|
||||||
vertexarray = &((*vertexarrays[vt]) [0]);
|
vertexarray = &((*vertexarrays[vt]) [0]);
|
||||||
|
Reference in New Issue
Block a user