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) { | ||||
| 	RAS_CameraData camdata; | ||||
| 	RAS_CameraData camdata(ca->lens, ca->clipsta, ca->clipend, ca->type == CAM_PERSP); | ||||
| 	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->SetName(ca->id.name + 2); | ||||
| 	 | ||||
|   | ||||
| @@ -37,6 +37,7 @@ SOURCEDIR = source/gameengine/GamePlayer | ||||
| DIR = $(OCGDIR)/gameengine/GamePlayer | ||||
| DIRS = common ghost | ||||
|  | ||||
| ifneq ($(NAN_NO_PLUGIN),true) | ||||
| ifeq ($(OS),$(findstring $(OS), "freebsd irix windows")) | ||||
| 	ifneq ($(FREE_WINDOWS),true) | ||||
| 	    DIRS += netscape | ||||
| @@ -54,5 +55,6 @@ ifeq ($(OS),$(findstring $(OS), "solaris")) | ||||
|     DIRS += netscape | ||||
|   endif | ||||
| endif | ||||
| endif | ||||
|  | ||||
| include nan_subdirs.mk | ||||
|   | ||||
| @@ -118,7 +118,7 @@ int my_set_tpage(TFace *tface) | ||||
| 	unsigned int *rect, *bind; | ||||
| 	int tpx, tpy, tilemode, tileXRep,tileYRep; | ||||
|  | ||||
| 	/* afschakelen */ | ||||
| 	/* disable */ | ||||
| 	if(tface==0) { | ||||
| 		if(lasttface==0) return 0; | ||||
| 		 | ||||
|   | ||||
| @@ -144,10 +144,10 @@ bool GPG_Application::startWindow(STR_String& title, | ||||
| 	//STR_String title ("Blender Player - GHOST"); | ||||
| 	m_mainWindow = fSystem->createWindow(title, windowLeft, windowTop, windowWidth, windowHeight, GHOST_kWindowStateNormal, | ||||
| 		GHOST_kDrawingContextTypeOpenGL, stereoVisual); | ||||
|     if (!m_mainWindow) { | ||||
| 	if (!m_mainWindow) { | ||||
| 		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 | ||||
| 	 * 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. | ||||
| 	/* | ||||
| 	 | ||||
| 	m_canvas->SetBannerDisplayEnabled(true);	 | ||||
| 	Camera* cam; | ||||
| /*	Camera* cam; | ||||
| 	cam = (Camera*)G.scene->camera->data; | ||||
| 	if (cam) { | ||||
| 	if (((cam->flag) & 48)==48) { | ||||
| 	m_canvas->SetBannerDisplayEnabled(false); | ||||
| 	} | ||||
| 		if (((cam->flag) & 48)==48) { | ||||
| 			m_canvas->SetBannerDisplayEnabled(false); | ||||
| 		} | ||||
| 	} | ||||
| 	else { | ||||
| 	showError(CString("Camera data invalid.")); | ||||
|   | ||||
| @@ -104,8 +104,8 @@ void usage(char* program) | ||||
| 	consoleoption = ""; | ||||
| #endif | ||||
| 	 | ||||
| 	printf("usage:   %s -w [-p l t w h] %s[-g gamengineoptions] " | ||||
| 		"-s stereomode filename.blend\n", program, consoleoption); | ||||
| 	printf("usage:   %s [-w [-p l t w h]] %s[-g gamengineoptions] " | ||||
| 		"[-s stereomode] filename.blend\n", program, consoleoption); | ||||
| 	printf("  -w: display in a window\n"); | ||||
| 	printf("  -p: specify window position\n"); | ||||
| 	printf("       l = window left coordinate\n"); | ||||
|   | ||||
| @@ -37,7 +37,7 @@ | ||||
|  */ | ||||
| struct KX_ClientObjectInfo | ||||
| { | ||||
| 	enum { | ||||
| 	enum clienttype { | ||||
| 		STATIC, | ||||
| 		ACTOR, | ||||
| 		RESERVED1, | ||||
| @@ -47,9 +47,13 @@ struct KX_ClientObjectInfo | ||||
| 	void*		m_clientobject; | ||||
| 	void*		m_auxilary_info; | ||||
| public: | ||||
| 	KX_ClientObjectInfo(void *clientobject) : | ||||
| 		m_clientobject(clientobject)  | ||||
| 	KX_ClientObjectInfo(void *clientobject, clienttype type = STATIC, void *auxilary_info = NULL) : | ||||
| 		m_type(type), | ||||
| 		m_clientobject(clientobject), | ||||
| 		m_auxilary_info(auxilary_info) | ||||
| 	{} | ||||
| 	 | ||||
| 	bool isActor() { return m_type <= ACTOR; } | ||||
| }; | ||||
|  | ||||
| #endif //__KX_CLIENTOBJECT_INFO_H | ||||
|   | ||||
| @@ -80,7 +80,7 @@ | ||||
| GEN_Map<GEN_HashedPtr,DT_ShapeHandle> map_gamemesh_to_sumoshape; | ||||
|  | ||||
| // 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); | ||||
|  | ||||
|  | ||||
| @@ -158,7 +158,7 @@ void	KX_ConvertSumoObject(	KX_GameObject* gameobj, | ||||
| 		sumoObj->setRigidBody(objprop->m_angular_rigidbody?true:false); | ||||
| 		 | ||||
| 		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 { | ||||
| @@ -229,7 +229,7 @@ void	KX_ConvertSumoObject(	KX_GameObject* gameobj, | ||||
| 					 | ||||
| 					BL_RegisterSumoObject(gameobj,sceneptr, | ||||
| 						sumoEnv->GetSolidScene(),sumoObj, | ||||
| 						matname.ReadPtr(), | ||||
| 						matname, | ||||
| 						objprop->m_dyna, | ||||
| 						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; | ||||
|  | ||||
| 		// 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()); | ||||
| 		 | ||||
|   | ||||
| @@ -73,8 +73,7 @@ KX_GameObject::KX_GameObject( | ||||
| 	m_pPhysicsController1(NULL) | ||||
| { | ||||
| 	m_ignore_activity_culling = false; | ||||
| 	m_pClient_info = new KX_ClientObjectInfo(this); | ||||
| 	m_pClient_info->m_type = KX_ClientObjectInfo::ACTOR; | ||||
| 	m_pClient_info = new KX_ClientObjectInfo(this, KX_ClientObjectInfo::ACTOR); | ||||
| 	m_pSGNode = new SG_Node(this,sgReplicationInfo,callbacks); | ||||
| 	 | ||||
| 	// define the relationship between this node and it's parent. | ||||
|   | ||||
| @@ -63,25 +63,25 @@ class KX_GameObject : public SCA_IObject | ||||
| { | ||||
| 	Py_Header; | ||||
|  | ||||
| 	bool								m_bDyna; | ||||
| 	KX_ClientObjectInfo*				m_pClient_info; | ||||
| 	STR_String							m_name; | ||||
| 	STR_String							m_text; | ||||
| 	bool					m_bDyna; | ||||
| 	KX_ClientObjectInfo*			m_pClient_info; | ||||
| 	STR_String				m_name; | ||||
| 	STR_String				m_text; | ||||
| 	std::vector<RAS_MeshObject*>		m_meshes; | ||||
| 	 | ||||
| 	bool								m_bSuspendDynamics; | ||||
| 	bool								m_bUseObjectColor; | ||||
| 	MT_Vector4							m_objectColor; | ||||
| 	bool					m_bSuspendDynamics; | ||||
| 	bool					m_bUseObjectColor; | ||||
| 	MT_Vector4				m_objectColor; | ||||
|  | ||||
| 	// Is this object set to be visible? Only useful for the | ||||
| 	// visibility subsystem right now. | ||||
| 	bool       m_bVisible;  | ||||
| 	bool					m_bVisible;  | ||||
|  | ||||
| 	KX_IPhysicsController*				m_pPhysicsController1; | ||||
| 	SG_Node*							m_pSGNode; | ||||
| 	KX_IPhysicsController*			m_pPhysicsController1; | ||||
| 	SG_Node*				m_pSGNode; | ||||
|  | ||||
| protected: | ||||
| 	MT_CmMatrix4x4						m_OpenGL_4x4Matrix; | ||||
| 	MT_CmMatrix4x4				m_OpenGL_4x4Matrix; | ||||
| 	 | ||||
| public: | ||||
| 	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_client_info = new KX_ClientObjectInfo(gameobj); | ||||
| 	m_client_info->m_type = KX_ClientObjectInfo::NEAR; | ||||
| 	m_client_info = new KX_ClientObjectInfo(gameobj, KX_ClientObjectInfo::NEAR); | ||||
| 	 | ||||
| 	DT_ShapeHandle shape = (DT_ShapeHandle) vshape; | ||||
| 	m_sumoObj = new SM_Object(shape,NULL,NULL,NULL); | ||||
| @@ -91,9 +90,7 @@ KX_NearSensor::KX_NearSensor(SCA_EventManager* eventmgr, | ||||
| 			 m_ResetMargin(resetmargin) | ||||
|  | ||||
| { | ||||
| 	m_client_info = new KX_ClientObjectInfo(gameobj); | ||||
| 	m_client_info->m_type = KX_ClientObjectInfo::NEAR; | ||||
| 	m_client_info->m_auxilary_info = NULL; | ||||
| 	m_client_info = new KX_ClientObjectInfo(gameobj, KX_ClientObjectInfo::NEAR); | ||||
| 	 | ||||
| 	m_sumoObj = new SM_Object(DT_NewSphere(0.0),NULL,NULL,NULL); | ||||
| 	m_sumoObj->setMargin(m_Margin); | ||||
| @@ -118,9 +115,7 @@ CValue* KX_NearSensor::GetReplica() | ||||
| 	// this will copy properties and so on... | ||||
| 	CValue::AddDataToReplica(replica); | ||||
| 	 | ||||
| 	replica->m_client_info = new KX_ClientObjectInfo(m_client_info->m_clientobject); | ||||
| 	replica->m_client_info->m_type = KX_ClientObjectInfo::NEAR; | ||||
| 	replica->m_client_info->m_auxilary_info = NULL; | ||||
| 	replica->m_client_info = new KX_ClientObjectInfo(m_client_info->m_clientobject, KX_ClientObjectInfo::NEAR); | ||||
| 	 | ||||
| 	replica->m_sumoObj = new SM_Object(DT_NewSphere(0.0),NULL,NULL,NULL); | ||||
| 	replica->m_sumoObj->setMargin(m_Margin); | ||||
|   | ||||
| @@ -119,6 +119,19 @@ KX_TouchSensor::~KX_TouchSensor() | ||||
| 	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) | ||||
| { | ||||
| 	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 :  | ||||
| 			NULL); | ||||
| 	 | ||||
| 	if (gameobj && (gameobj != parent)) | ||||
| 	if (gameobj && (gameobj != parent) && client_info->isActor()) | ||||
| 	{ | ||||
| 		if (!m_colliders->SearchValue(gameobj)) | ||||
| 			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) | ||||
| 				{ | ||||
| 					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 | ||||
| 			{ | ||||
| 				found = (gameobj->GetProperty(m_touchedpropname) != NULL); | ||||
|   | ||||
| @@ -77,17 +77,7 @@ public: | ||||
| 		PyTypeObject* T=&Type) ; | ||||
| 	virtual ~KX_TouchSensor(); | ||||
|  | ||||
| 	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 CValue* GetReplica(); | ||||
| 	virtual void SynchronizeTransform(); | ||||
| 	virtual bool Evaluate(CValue* event); | ||||
| 	virtual void ReParent(SCA_IObject* parent); | ||||
|   | ||||
| @@ -92,7 +92,7 @@ vector<NG_NetworkMessage*> NG_LoopBackNetworkDeviceInterface::RetrieveNetworkMes | ||||
| 	vector<NG_NetworkMessage*> messages; | ||||
| 	 | ||||
| 	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 | ||||
|   | ||||
| @@ -374,6 +374,8 @@ DT_Bool SM_Object::boing( | ||||
| 	if (obj2->isDynamic()) | ||||
| 		obj2->dynamicCollision(local2, -normal, dist, -rel_vel, restitution, friction_factor, invMass); | ||||
| 	 | ||||
| 	//fix(client_data, (void*) obj1, (void*) obj2, coll_data); | ||||
| 	 | ||||
| 	return DT_CONTINUE; | ||||
| } | ||||
|  | ||||
| @@ -412,6 +414,9 @@ DT_Bool SM_Object::fix( | ||||
| 	// Get collision data from SOLID | ||||
| 	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  | ||||
| 	// necessary. Non-dynamic objects are assumed to have infinite mass. | ||||
| 	if (obj1->isDynamic()) { | ||||
| @@ -461,9 +466,34 @@ void SM_Object::relax(void) | ||||
| 	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. | ||||
| 	std::cout << "SM_Object::SM_Object()" << std::endl; | ||||
| } | ||||
|  | ||||
| SM_Object:: | ||||
|   | ||||
| @@ -162,8 +162,8 @@ void SM_Scene::remove(SM_Object& object) { | ||||
|  | ||||
| void SM_Scene::proceed(MT_Scalar timeStep, MT_Scalar subSampling) { | ||||
| 	// Don't waste time...but it's OK to spill a little. | ||||
| 	if (timeStep < 0.001) | ||||
| 		return; | ||||
| 	//if (timeStep < 0.001) | ||||
| 	//	return; | ||||
|  | ||||
| 	// Divide the timeStep into a number of subsamples of size roughly  | ||||
| 	// equal to subSampling (might be a little smaller). | ||||
| @@ -208,14 +208,16 @@ void SM_Scene::proceed(MT_Scalar timeStep, MT_Scalar subSampling) { | ||||
| #if 0 | ||||
| 	clearObjectCombinedVelocities(); | ||||
| #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) | ||||
| 			(*i)->relax();  | ||||
| 			(*i)->relax();  */ | ||||
| 	DT_Test(m_scene, m_fixRespTable); | ||||
| 	 | ||||
| 	// Finish this timestep by saving al state information for the next | ||||
| 	// timestep and clearing the accumulated forces.  | ||||
|  | ||||
| 	for (i = m_objectList.begin(); i != m_objectList.end(); ++i) { | ||||
| 		(*i)->relax(); | ||||
| 		(*i)->proceedKinematic(timeStep); | ||||
| 		(*i)->saveReactionForce(timeStep); | ||||
| 		(*i)->clearForce(); | ||||
|   | ||||
| @@ -71,6 +71,7 @@ SumoPhysicsController::~SumoPhysicsController() | ||||
| 		m_sumoScene->remove(*m_sumoObj); | ||||
| 		 | ||||
| 		delete m_sumoObj; | ||||
| 		m_sumoObj = NULL; | ||||
| 	} | ||||
| } | ||||
|  | ||||
|   | ||||
| @@ -56,6 +56,7 @@ SumoPhysicsEnvironment::SumoPhysicsEnvironment() | ||||
|  | ||||
| SumoPhysicsEnvironment::~SumoPhysicsEnvironment() | ||||
| { | ||||
| 	std::cout << "delete m_sumoScene " << m_sumoScene << std::endl; | ||||
| 	delete m_sumoScene; | ||||
| 	DT_DestroyScene(m_solidScene); | ||||
| 	//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_clipstart; | ||||
| 	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 | ||||
|   | ||||
| @@ -94,8 +94,12 @@ public: | ||||
| 	virtual void	ClearDepthBuffer()=0; | ||||
| 	virtual void	ClearCachingInfo(void)=0; | ||||
| 	virtual void	EndFrame()=0; | ||||
| 	/** | ||||
| 	 * SetRenderArea sets the render area in the 2d canvas | ||||
| 	 */ | ||||
| 	virtual void	SetRenderArea()=0; | ||||
|  | ||||
| 	// Stereo Functions | ||||
| 	virtual void	SetStereoMode(const int stereomode)=0; | ||||
| 	virtual bool	Stereo()=0; | ||||
| 	virtual void	SetEye(const int eye)=0; | ||||
| @@ -103,6 +107,20 @@ public: | ||||
| 	virtual void	SetFocalLength(const float focallength)=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, | ||||
| 							const vecIndexArrays & indexarrays, | ||||
| 							int mode, | ||||
| @@ -110,6 +128,10 @@ public: | ||||
| 							class RAS_IRenderTools* rendertools, | ||||
| 							bool useObjectColor, | ||||
| 							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, | ||||
| 							const vecIndexArrays & indexarrays, | ||||
| 							int mode, | ||||
| @@ -117,6 +139,10 @@ public: | ||||
| 							class RAS_IRenderTools* rendertools, | ||||
| 							bool useObjectColor, | ||||
| 							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, | ||||
| 							const vecIndexArrays & indexarrays, | ||||
| 							int mode, | ||||
| @@ -161,12 +187,18 @@ public: | ||||
| 								 float blue, | ||||
| 								 float alpha)=0; | ||||
| 	 | ||||
| 	/** | ||||
| 	 * @param drawingmode = KX_BOUNDINGBOX, KX_WIREFRAME, KX_SOLID, KX_SHADED or KX_TEXTURED. | ||||
| 	 */ | ||||
| 	virtual void	SetDrawingMode(int drawingmode)=0; | ||||
| 	virtual int		GetDrawingMode()=0; | ||||
|  | ||||
| 	virtual void	EnableTextures(bool enable)=0; | ||||
| 	 | ||||
| 	virtual void	SetCullFace(bool enable)=0; | ||||
| 	/** | ||||
| 	 * Sets wireframe mode. | ||||
| 	 */ | ||||
| 	virtual void    SetLines(bool enable)=0; | ||||
|  | ||||
| 	virtual double	GetTime()=0; | ||||
| @@ -177,7 +209,8 @@ public: | ||||
| 		float bottom, | ||||
| 		float top, | ||||
| 		float frustnear, | ||||
| 		float frustfar | ||||
| 		float frustfar, | ||||
| 		bool perspective = true | ||||
| 	)=0; | ||||
|  | ||||
| 	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_shininess[] = { 35.0 }; | ||||
| @@ -259,7 +259,7 @@ void RAS_OpenGLRasterizer::Exit() | ||||
| 	glClearDepth(1.0);  | ||||
| 	glClearColor(m_redback, m_greenback, m_blueback, m_alphaback); | ||||
| 	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | ||||
|     glDepthMask (GL_TRUE); | ||||
| 	glDepthMask (GL_TRUE); | ||||
| 	glDepthFunc(GL_LEQUAL); | ||||
| 	glBlendFunc(GL_ONE, GL_ZERO); | ||||
|  | ||||
| @@ -292,7 +292,7 @@ bool RAS_OpenGLRasterizer::BeginFrame(int drawingmode, double time) | ||||
|  | ||||
| 	glShadeModel(GL_SMOOTH); | ||||
|  | ||||
|    m_2DCanvas->BeginFrame(); | ||||
| 	m_2DCanvas->BeginFrame(); | ||||
| 	 | ||||
| 	return true; | ||||
| } | ||||
| @@ -1083,7 +1083,8 @@ MT_Matrix4x4 RAS_OpenGLRasterizer::GetFrustumMatrix( | ||||
| 	float bottom, | ||||
| 	float top, | ||||
| 	float frustnear, | ||||
| 	float frustfar | ||||
| 	float frustfar, | ||||
| 	bool perspective | ||||
| ){ | ||||
| 	MT_Matrix4x4 result; | ||||
| 	double mat[16]; | ||||
| @@ -1114,6 +1115,7 @@ MT_Matrix4x4 RAS_OpenGLRasterizer::GetFrustumMatrix( | ||||
| 	glMatrixMode(GL_PROJECTION); | ||||
| 	glLoadIdentity(); | ||||
| 	glFrustum(left, right, bottom, top, frustnear, frustfar); | ||||
| 		 | ||||
| 	glGetDoublev(GL_PROJECTION_MATRIX, mat); | ||||
| 	result.setValue(mat); | ||||
|  | ||||
|   | ||||
| @@ -203,7 +203,8 @@ public: | ||||
| 							float bottom, | ||||
| 							float top, | ||||
| 							float frustnear, | ||||
| 							float frustfar | ||||
| 							float frustfar, | ||||
| 							bool perspective | ||||
| 						); | ||||
|  | ||||
| 	virtual void	SetSpecularity( | ||||
|   | ||||
| @@ -73,10 +73,6 @@ bool RAS_VAOpenGLRasterizer::Init(void) | ||||
| 	 | ||||
| 	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); | ||||
| 		glDisableClientState(GL_TEXTURE_COORD_ARRAY); | ||||
| 		glDisableClientState(GL_NORMAL_ARRAY); | ||||
| @@ -187,6 +183,17 @@ void RAS_VAOpenGLRasterizer::IndexPrimitives( const vecVertexArray& vertexarrays | ||||
| 		glColor3d(0,0,0); | ||||
| 	} | ||||
| 	// 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++) | ||||
| 	{ | ||||
| 		vertexarray = &((*vertexarrays[vt]) [0]); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user