PhysX in TGE Version 0.3 (Work-In-Progress)
by Shannon "ScarWars" Scarvaci · 07/03/2006 (11:35 am) · 269 comments
Outline
1. License
2. Get SDK from Ageia
3. Implementation
4. Scripts
5. Know Issues
6. Need your supports!
License:
The license of PhysX is following:
Get SDK from Ageiq
You can obtain the SDK from www.ageia.com website, my currently version for this physics is 2.7.0.
If you are using Visual Studio then you need to add "include" and "library" in the project configuration.
(If you using linux or mac, then i don't know where to setup because I dont have linux or mac with me)
Directory for include files:
C:\Program Files\AGEIA PhysX SDK\v2.6.4\SDKs\Physics\include
C:\Program Files\AGEIA PhysX SDK\v2.6.4\SDKs\Foundation\include
C:\Program Files\AGEIA PhysX SDK\v2.6.4\SDKs\PhysXLoader\include
C:\Program Files\AGEIA PhysX SDK\v2.6.4\SDKs\Cooking\include
Directory for library files:
C:\Program Files\AGEIA PhysX SDK\v2.6.4\SDKs\lib\win32
Note: These files' path's are relative to my hard drive, your files may be in different directory depending on how you installed the PhysX SDK.
Please install AGEIA PhysX Runtime in your PC (prefered lastest version)
Also put two dll file (PhysXLoader.dll and NxCooking.dll from AGEIA PhysX SDK\v2.7.0\SDKs\Bin\win32) in the example folder.
Implementation
Copy the 17 files from "PhysX" folder into engine/PhysX and modify some TGE's source code files.
Player
in game/player.h in bold
game/player.cc at the top in bold
game/player.cc in Player::Player() function
game/player.cc in Player::onAdd() function
game/player.cc in Player::setPosition(...)
Terrain
in terrain/terrData.cc
at the top of the file
terrain/terrData.cc in TerrainBlock::onAdd function near the end
Interior
in interior/interior.h
in interior/interiorInstance.h
in interior/interiorInstance.cc
TSStatic
in ts/tsShapeInstance.h
in game/tsStatic.h
in game/tsStatic.cc
ShapeBase
in game\shapeBase.h
Material in GameBase
in game\gameBase.h
Scripts
Copy three script files (PhysX.cs, physXActorBox.cs and physXActorSphere.cs) in starter.fps/server/scripts and add three lines of code in starter.fps/server/scripts/games.cs
add one line of code in common/client/mission.cs
and in every mission file need to add PhysXWorld as show in bold:
If you want to testing around by droping the object in the free-look camera, then use default.bind.cs script
Know Issues
Terrain is the problem here because PhysX can accept 256x256 collision mesh in their engine which is mean squareSize equal to one! So the TGE's default squareSize is 8 and you see object will miss the collision in some area of the terrain. Possible solution is to create chunks, for example if you use squareSize of 8 then use 64 chunks of 256x256 collision mesh.
Loading the mesh of 256x256 collision will very slow but there possible solution is to write the mesh to file create by PhysX engine and read the file from PhysX will be lots faster, similar to lighting system which is used in TGE.
I've tried number of way to use Terrain collision in PhysX such as split in four section, NxHeightfield which make it very slow but I haven't tried this in PPU yet. So I have to stick with 256x256 collision mesh for a while.
Player/ShapeBase collision with PhysX's object is not complete.
Networking:
Loading objects from the begin in the remote client sometime not showing but if object appear during the gameplay will work ok. That something i need to be working on. (There may be some problem because of improved speed, but didn't test it yet)
Improved PhysX Speed
Big thank to decryptoid for helping us in PhysX, esp. for speed improvement.
Need your supports!
Now you can play with PhysX in your TGE game! If you find any improvement for this Physics in coding or script or anything please post here and I'll happy to update in here.
Also please use TDNfor any info to advise for our community
In the future:
- Run in PPU.
- Player collision.
- ShapeBase, (TSStatic and Interior - Completed) collision.
- Use advance physics such as joints, clothes and fluid. Done two type of joints
Enjoy your Physics!
Check out the video.
First Video
Second Video
Joints Video (4MB, prefer download before watch)
This is my first resource, please be kind to me :)
Due to file limit please download from here Updated 13th Apirl 2006
Here TGEA PhysX Resource here
1. License
2. Get SDK from Ageia
3. Implementation
4. Scripts
5. Know Issues
6. Need your supports!
License:
The license of PhysX is following:
Free:
* Commercial & non-commercial use on PC
Must keep registration information currect
Must agree to the EULA at the time of download (pops up, but is copied below)
Available for Windows & Linux (soon)
No PhysX HW support requirement
* PS3 platform (through Sony pre-purchase)
* All platforms through some of our middleware partnerships, such as UE3, Gamebryo 2.2,
and others
k per platform:
* Xbox 360
* Fee may be waived at our discretion for multi-platform developers providing PC HW support
* Fee may be waived at our discretion for some Tools & Middleware providersGet SDK from Ageiq
You can obtain the SDK from www.ageia.com website, my currently version for this physics is 2.7.0.
If you are using Visual Studio then you need to add "include" and "library" in the project configuration.
(If you using linux or mac, then i don't know where to setup because I dont have linux or mac with me)
Directory for include files:
C:\Program Files\AGEIA PhysX SDK\v2.6.4\SDKs\Physics\include
C:\Program Files\AGEIA PhysX SDK\v2.6.4\SDKs\Foundation\include
C:\Program Files\AGEIA PhysX SDK\v2.6.4\SDKs\PhysXLoader\include
C:\Program Files\AGEIA PhysX SDK\v2.6.4\SDKs\Cooking\include
Directory for library files:
C:\Program Files\AGEIA PhysX SDK\v2.6.4\SDKs\lib\win32
Note: These files' path's are relative to my hard drive, your files may be in different directory depending on how you installed the PhysX SDK.
Please install AGEIA PhysX Runtime in your PC (prefered lastest version)
Also put two dll file (PhysXLoader.dll and NxCooking.dll from AGEIA PhysX SDK\v2.7.0\SDKs\Bin\win32) in the example folder.
Implementation
Copy the 17 files from "PhysX" folder into engine/PhysX and modify some TGE's source code files.
Player
in game/player.h in bold
//----------------------------------------------------------------------------
[b]struct sNxActor;[/b]
class Player: public ShapeBase
{
typedef ShapeBase Parent;
[b]sNxActor *mActor;[/b]
protected:
/// Bit masks for different types of events
enum MaskBits {game/player.cc at the top in bold
//----------------------------------------------------------------------------- // Torque Game Engine // Copyright (C) GarageGames.com, Inc. //----------------------------------------------------------------------------- [b]#include "physX/PhysX.h" #include "physX/PhysXWorld.h"[/b] #include "game/player.h"
game/player.cc in Player::Player() function
mMountPending = 0; [b]mActor = NULL;[/b] }
game/player.cc in Player::onAdd() function
gCamFXMgr.clear();
}
[b]PhysXWorld *PxWorld = PhysXWorld::getWorld(isServerObject());
if (PxWorld) {
mActor = PxWorld->AddShapeBase(this);
}[/b]
return true;game/player.cc in Player::setPosition(...)
else {
mat.set(EulerF(0, 0, rot.z));
mat.setColumn(3,pos);
}
[b]if (mActor) {
QuatF q(mat);
Point3F pos;
mat.getColumn(3,&pos);
NxQuat quat;
quat.setXYZW(q.x,q.y,q.z,q.w);
mActor->actor->setGlobalOrientationQuat(quat);
mActor->actor->setGlobalPosition(NxVec3(pos.x,pos.y,pos.z));
}[/b]
Parent::setTransform(mat);
mRot = rot;
}Terrain
in terrain/terrData.cc
at the top of the file
#include "terrain/terrRender.h" #include "terrain/blender.h" [b]#include "physX/PhysXWorld.h"[/b] extern bool gDGLRender;
terrain/terrData.cc in TerrainBlock::onAdd function near the end
if(!unpackEmptySquares())
return(false);
[b]PhysXWorld *PxWorld = PhysXWorld::getWorld(isServerObject());
if (PxWorld) {
PxWorld->SetupTerrainCollision(); // old style
}[/b]
return true;
}Interior
in interior/interior.h
class Interior
{
...
friend class EditInteriorResource;
[b]friend class PhysXInterior;[/b]in interior/interiorInstance.h
class InteriorInstance : public SceneObject
{
...
friend class FloorPlan;
[b]friend class PhysXInterior;
friend class PhysXWorld;[/b]in interior/interiorInstance.cc
#include "platform/profiler.h"
[b]#include "physX/PhysXWorld.h"[/b]
...
bool InteriorInstance::onAdd()
{
...
addToScene();
[b]PhysXWorld *PxWorld = PhysXWorld::getWorld(isServerObject());
if (PxWorld) {
PxWorld->SetupInterior(*this);
}[/b]
return true;
}TSStatic
in ts/tsShapeInstance.h
class TSShapeInstance
{
...
friend class TSPartInstance;
[b]friend class PhysXTSStatic;
friend class PhysXActor;[/b]in game/tsStatic.h
class TSStatic : public SceneObject
{
...
friend class TSStaticConvex;
[b]friend class PhysXTSStatic;[/b]in game/tsStatic.cc
#include "sim/netConnection.h"
[b]#include "physX/PhysXWorld.h"[/b]
...
bool TSStatic::onAdd()
{
...
addToScene();
[b]PhysXWorld *PxWorld = PhysXWorld::getWorld(isServerObject());
if (PxWorld) {
PxWorld->SetupTSStatic(*this);
}[/b]
return true;
}ShapeBase
in game\shapeBase.h
class ShapeBase : public GameBase
{
typedef GameBase Parent;
friend class ShapeBaseConvex;
friend class ShapeBaseImageData;
[b]friend class PhysXWorld;[/b]Material in GameBase
in game\gameBase.h
[b]struct PhysXMaterialData;[/b]
struct GameBaseData : public SimDataBlock {
...
void unpackData(BitStream* stream);
[b]// PhysX
PhysXMaterialData* mMaterialBlock;[/b]
};
...
class GameBase : public SceneObject
{
...
enum GameBaseMasks {
InitialUpdateMask = Parent::NextFreeMask,
DataBlockMask = InitialUpdateMask << 1,
ExtendedInfoMask = DataBlockMask << 1,
ControlMask = ExtendedInfoMask << 1,
[b]//NextFreeMask = ControlMask << 1
// PhysX
MaterialDataBlockMask = ControlMask << 1,
NextFreeMask = MaterialDataBlockMask << 1[/b]
};
...
[b]// PhysX
bool setMaterialDataBlock(PhysXMaterialData* dptr);
bool onNewMaterialDataBlock(PhysXMaterialData* dptr);[/b]
};
...in game\gameBase.cc[b]#include "physX/PhysX.h"
#include "physX/PhysXActor.h"[/b]
#include "platform/platform.h"
...
GameBaseData::GameBaseData()
{
...
[b]mMaterialBlock = 0;[/b]
}
...
[b]IMPLEMENT_CONSOLETYPE(PhysXMaterialData)
IMPLEMENT_GETDATATYPE(PhysXMaterialData)
IMPLEMENT_SETDATATYPE(PhysXMaterialData)[/b]
void GameBaseData::initPersistFields()
{
Parent::initPersistFields();
...
[b]addField("materialBlock", TypePhysXMaterialDataPtr, Offset(mMaterialBlock, GameBaseData));[/b]
}
...
bool GameBase::onNewDataBlock(GameBaseData* dptr)
{
...
[b]onNewMaterialDataBlock(mDataBlock->mMaterialBlock);[/b]
setMaskBits(DataBlockMask);
return true;
}
...
bool GameBase::setDataBlock(GameBaseData* dptr)
{
...
}
[b]bool GameBase::setMaterialDataBlock(PhysXMaterialData* dptr)
{
if (isGhost() || isProperlyAdded()) {
if (mDataBlock->mMaterialBlock != dptr)
return onNewMaterialDataBlock(dptr);
}
else
mDataBlock->mMaterialBlock = dptr;
return true;
}
bool GameBase::onNewMaterialDataBlock(PhysXMaterialData* dptr)
{
mDataBlock->mMaterialBlock = dptr;
if (!mDataBlock->mMaterialBlock)
return false;
setMaskBits(MaterialDataBlockMask);
return true;
}[/b]
...
U32 GameBase::packUpdate(NetConnection *, U32 mask, BitStream *stream)
{
...
[b]if (stream->writeFlag((mask & MaterialDataBlockMask) && mDataBlock->mMaterialBlock != NULL)) {
stream->writeRangedU32(mDataBlock->mMaterialBlock->getId(),
DataBlockObjectIdFirst,
DataBlockObjectIdLast);
}[/b]
// cafTODO: ControlMask
return 0;
}
void GameBase::unpackUpdate(NetConnection *con, BitStream *stream)
{
...
[b]if (stream->readFlag()) {
PhysXMaterialData* dptrMD = 0;
SimObjectId id = stream->readRangedU32(DataBlockObjectIdFirst, DataBlockObjectIdLast);
if (!Sim::findObject(id,dptrMD) || !setMaterialDataBlock(dptrMD))
con->setLastError("Invalid packet GameBase::unpackUpdate()");
}[/b]
}Scripts
Copy three script files (PhysX.cs, physXActorBox.cs and physXActorSphere.cs) in starter.fps/server/scripts and add three lines of code in starter.fps/server/scripts/games.cs
// PhysX
exec("./physX.cs");
exec("./physXActorBox.cs");
exec("./physXActorSphere.cs");
exec("./physXJoints.cs");add one line of code in common/client/mission.cs
function clientCmdMissionStart(%seq)
{
// The client recieves a mission start right before
// being dropped into the game.
[b]startPhysX();[/b]
}and in every mission file need to add PhysXWorld as show in bold:
new SimGroup(MissionGroup) {
[b]new PhysXWorld() {
errorReport = false; // set to true if you want error report from PhysX
};[/b]
new ScriptObject(MissionInfo) {
...If you want to testing around by droping the object in the free-look camera, then use default.bind.cs script
function addCrate(%val)
{
if (%val)
commandToServer('pxcrate');
}
function addBox(%val)
{
if (%val)
commandToServer('pxbox');
}
function addRock(%val)
{
if (%val)
commandToServer('pxsphere');
}
moveMap.bind( keyboard, "alt r", addCrate);
moveMap.bind( keyboard, "alt t", addBox);
moveMap.bind( keyboard, "alt y", addRock);Know Issues
Terrain is the problem here because PhysX can accept 256x256 collision mesh in their engine which is mean squareSize equal to one! So the TGE's default squareSize is 8 and you see object will miss the collision in some area of the terrain. Possible solution is to create chunks, for example if you use squareSize of 8 then use 64 chunks of 256x256 collision mesh.
Loading the mesh of 256x256 collision will very slow but there possible solution is to write the mesh to file create by PhysX engine and read the file from PhysX will be lots faster, similar to lighting system which is used in TGE.
I've tried number of way to use Terrain collision in PhysX such as split in four section, NxHeightfield which make it very slow but I haven't tried this in PPU yet. So I have to stick with 256x256 collision mesh for a while.
Player/ShapeBase collision with PhysX's object is not complete.
Networking:
Loading objects from the begin in the remote client sometime not showing but if object appear during the gameplay will work ok. That something i need to be working on. (There may be some problem because of improved speed, but didn't test it yet)
Improved PhysX Speed
Big thank to decryptoid for helping us in PhysX, esp. for speed improvement.
Need your supports!
Now you can play with PhysX in your TGE game! If you find any improvement for this Physics in coding or script or anything please post here and I'll happy to update in here.
Also please use TDNfor any info to advise for our community
In the future:
- Run in PPU.
- Player collision.
- ShapeBase, (TSStatic and Interior - Completed) collision.
- Use advance physics such as joints, clothes and fluid. Done two type of joints
Enjoy your Physics!
Check out the video.
First Video
Second Video
Joints Video (4MB, prefer download before watch)
This is my first resource, please be kind to me :)
Due to file limit please download from here Updated 13th Apirl 2006
Here TGEA PhysX Resource here
About the author
#82
07/04/2006 (9:48 am)
I wanted it to be known that I downgraded my Resource Rating to 3 because this resource is way above most of us with no distinct intro on how we can get to this level.
#83
Oh, also, no one really looks at the ratings, anyway. :)
07/04/2006 (7:36 pm)
You rate resources low because you aren't knowledgeable enough to implement it correctly? Integrating a physics engine is not something for developers who don't know what they're doing. It's a 0.1 version, incomplete, and for advanced programmers to get a head start.Oh, also, no one really looks at the ratings, anyway. :)
#84
This is getting off-track. The point is that the demo videos show some interesting, if basic, functionalities that are not currently native to Torque. It's deceptive, though. The simple manipulations of simple shapes requires some pretty heavy lifting for those of us who are fresh off the tutorial (n00b, not l33t).
If there were some back-track links that point at tutorials it would be beneficial for us n00bs trying to find our way to physics in gaming. After all, I've got some ideas that are significantly more complex then rolling a ball down a hill, I need to know how to get where I want to go, and bumping around the forums isn't exactly helpful most of the time.
If all of GarageGames resources were built this way (with back-track links to resources which should be read first) then you will probably find that people will not be asking questions in the wrong forum or expecting something from a resource that is addressed better elsewhere.
07/04/2006 (8:07 pm)
I rate something low because it's not documented enough to use. Then again, I am fairly new. I've found a majority of SDKs to be user un-friendly. It's likely that I'm spoiled on enterprise products. If I'm not supposed to rate it according to what I think of it, then how am I supposed to rate it?This is getting off-track. The point is that the demo videos show some interesting, if basic, functionalities that are not currently native to Torque. It's deceptive, though. The simple manipulations of simple shapes requires some pretty heavy lifting for those of us who are fresh off the tutorial (n00b, not l33t).
If there were some back-track links that point at tutorials it would be beneficial for us n00bs trying to find our way to physics in gaming. After all, I've got some ideas that are significantly more complex then rolling a ball down a hill, I need to know how to get where I want to go, and bumping around the forums isn't exactly helpful most of the time.
If all of GarageGames resources were built this way (with back-track links to resources which should be read first) then you will probably find that people will not be asking questions in the wrong forum or expecting something from a resource that is addressed better elsewhere.
#85
07/05/2006 (10:48 am)
Wow, looks awesome, i'm going to have fun implementing this.
#87
@Stalker; Yeah, for now!
07/06/2006 (12:46 am)
@T Squared; proof that one man's pain is another man's pleasure. If you could do us n00bs a favor and post some links to other helpful links that can get us to this step it would be very good of you.@Stalker; Yeah, for now!
#88
07/06/2006 (12:47 am)
You two (Stalker & n8man) make me laugh...
#89
07/06/2006 (1:27 am)
Thanks, we'll be here all week. Tip your waitresses!
#90
07/06/2006 (2:07 am)
not too far though, you don't want them to fall over, I think around 55-75 degrees to the side is around a safe angle for anyone but a one legged pirate thats lost his pegleg to be tipped.
#91
Yes correct. But are they so powerfull ?
Take a look to the newest videos of PhysX (specially Crysis). Have you ever seen such powerfull physics engine for free ? ODE is a good physics engine but with PhysX you can do more
:-D
07/12/2006 (9:35 am)
Quote:
50,000 for a license? no, thx ;)
We have enought free physics ;)
Yes correct. But are they so powerfull ?
Take a look to the newest videos of PhysX (specially Crysis). Have you ever seen such powerfull physics engine for free ? ODE is a good physics engine but with PhysX you can do more
:-D
#92
07/14/2006 (10:38 am)
I can't seem to find the SDK on there website. Under downloads it requires a license and login.
#94
08/06/2006 (4:13 pm)
Where can I find the PhysX and PhysXWorld header and source files?
#95
I get these errors with (stock)TGE 1.4 + VC2003 + Ageia v2.4.1
Linking...
terrData.obj : error LNK2001: unresolved external symbol "public: void __thiscall PhysXWorld::SetupTerrainCollision(void)" (?SetupTerrainCollision@PhysXWorld@@QAEXXZ)
terrData.obj : error LNK2001: unresolved external symbol "public: static class PhysXWorld * __cdecl PhysXWorld::getWorld(bool)" (?getWorld@PhysXWorld@@SAPAV1@_N@Z)
player.obj : error LNK2001: unresolved external symbol "public: static class PhysXWorld * __cdecl PhysXWorld::getWorld(bool)" (?getWorld@PhysXWorld@@SAPAV1@_N@Z)
player.obj : error LNK2001: unresolved external symbol "public: class NxActor * __thiscall PhysXWorld::AddShapeBase(class ShapeBase *)" (?AddShapeBase@PhysXWorld@@QAEPAVNxActor@@PAVShapeBase@@@Z)
../example/torqueDemo.exe : fatal error LNK1120: 3 unresolved externals
08/08/2006 (1:48 pm)
Could anyone please advise me ??I get these errors with (stock)TGE 1.4 + VC2003 + Ageia v2.4.1
Linking...
terrData.obj : error LNK2001: unresolved external symbol "public: void __thiscall PhysXWorld::SetupTerrainCollision(void)" (?SetupTerrainCollision@PhysXWorld@@QAEXXZ)
terrData.obj : error LNK2001: unresolved external symbol "public: static class PhysXWorld * __cdecl PhysXWorld::getWorld(bool)" (?getWorld@PhysXWorld@@SAPAV1@_N@Z)
player.obj : error LNK2001: unresolved external symbol "public: static class PhysXWorld * __cdecl PhysXWorld::getWorld(bool)" (?getWorld@PhysXWorld@@SAPAV1@_N@Z)
player.obj : error LNK2001: unresolved external symbol "public: class NxActor * __thiscall PhysXWorld::AddShapeBase(class ShapeBase *)" (?AddShapeBase@PhysXWorld@@QAEPAVNxActor@@PAVShapeBase@@@Z)
../example/torqueDemo.exe : fatal error LNK1120: 3 unresolved externals
#97
08/08/2006 (3:05 pm)
Alienforce do you have the PhysX.cpp, PhysX.h, PhysXWorld.cpp and PhysXWorld.h files?
#98
in your project and that you have a function body for the getWorld function.
08/08/2006 (3:10 pm)
Nevermind Alienforce. I see that the link is back and working now. To help you with your problem as I have seen those d**n linker errors before, make sure that the PhysXWorld.h and PhysXWorld.cpp files are includedin your project and that you have a function body for the getWorld function.
#99
08/08/2006 (3:49 pm)
Thanks Darnell, I will give it a try. :)
#100
PS. VS 2.4.1 do not compile.
08/08/2006 (5:11 pm)
Ageia Vs 2.3.3 compiles but i get "Wrong PhysX DLL version?" from physxworld.cpp @ 133 when trying to start mission file PhysX Testing. Anyone ??? please i am soooooo close now :/PS. VS 2.4.1 do not compile.

Torque Owner Skylar Kelty
SkylarK