fun with tokamak

Blitz3D Forums/Blitz3D Programming/fun with tokamak

bradford6(Posted 2004) [#1]
wsad and mouse to 'fly around'
left button apply force
ctrl+left button = apply lots of force
right button to place rigid body

try placing it on the lever and smacking the other end ...

;# TOKAMAK DEMO v7 (bradford6)
; Credits:
; SWEENIE for creating the TOKAMAK WRAPPER
; www.tokamakphysics.com to get SDK
; note:
; you must put TOKAMAK.DLL (from SDK) in system32
; must put sweenies tokamak files in blitz3d/userlibs directory
; thanks to fredborg for the maketokcollider func


Graphics3D 800,600,0,2
Global midw = GraphicsWidth()/2
Global midh =GraphicsHeight()/2
SetBuffer BackBuffer()
HidePointer 
WireFrame False

Const ENTS=100	; TOTAL NUMBER OF TOKAMAKPHYSICS ENTITIES
Const FPS=50
Const w=17, s=31, a=30, d=32, space=57

Global campiv = CreatePivot()
Global camera = CreateCamera(campiv)
Global pickmarker = CreateSphere(4)
EntityAlpha pickmarker,.75
Global pictentity,pnx#,pny#,pnz#,pcx#,pcy#,pcz#
Global latspeed#,speed#,MX#,MY#

Global TOKS
CameraClsColor(camera,20,20,205)


TOKSIM_CreateSimulator(ENTS,1,0,-10,0)

; go and create a generic checkerboard texture to apply to the objects
cubetex = create_cube_texture()
spheretex = create_sphere_texture()
cyltex = create_cyl_texture()
worldtex = create_world_texture()



world = CreateCube()
EntityPickMode world,2
sc# = 50
ScaleMesh world,sc#,sc#,sc#
PositionMesh world,0,sc#,0
FlipMesh world
EntityTexture world,worldtex
maketokcollider(world)


Dim obj(ENTS)
Dim rb(ENTS)

SeedRnd MilliSecs()  


; add--------------------------------------------------------------------------


	;create_TOK_BOX(xs#,ys#,zs#,xp#,yp#,zp#,damp#,angdamp#,mass#,iw#,ih#,id#,imass#, texture)
	;create_TOK_BOX(8,1,8,0,5,0,0.0025,.125,4,cubetex)
	xs#=32 iw#=xs#
	ys#=1 ih#=ys#
	zs#=8 id#=zs#	
	mass# = 2 imass# = mass#

	
	
	create_TOK_BOX(xs#,ys#,zs#,0,6,0,0.001,0.002,mass#,8,3,8,imass#,cubetex,"box")

	;create_TOK_BALL(segs,sc#,xp#,yp#,zp#,angdamp#,lindamp#,mass#,IT1#,IT2#)
	; # create tokamak sphere
	create_TOK_BALL(7,4,0,4,-4,0.002,0.001,2.0,1.0,.5,spheretex,"ball")
	create_TOK_BALL(7,4,0,4,4,0.002,0.001,2.0,1.0,.5,spheretex,"ball2")

	;TOKRB_SetTorque(rb(toks),5,0,0)
	joint1 = TOKJOINT_Create(2,rb(toks-2),rb(toks-1))
	TOKJOINT_SetType(joint1,1)
	TOKJOINT_SetPositionWorld(joint1,0,4,-4)
	TOKJOINT_Enable(joint1,True)
	
	joint2 = TOKJOINT_Create(2,rb(toks-2),rb(toks))
	TOKJOINT_SetType(joint2,1)
	TOKJOINT_SetPositionWorld(joint2,0,4,4)
	TOKJOINT_Enable(joint2,True)
	
	;joint3 = TOKJOINT_Create(1,rb(toks),0)
	;TOKJOINT_SetType(joint3,1)
	;TOKJOINT_SetPositionWorld(joint3,0,0,8)
	;TOKJOINT_Enable(joint3,True)

	;joint4 = TOKJOINT_Create(1,rb(toks-1),0)
	;TOKJOINT_SetType(joint4,1)
	;TOKJOINT_SetPositionWorld(joint4,0,0,-8)
	;TOKJOINT_Enable(joint4,True)


	
	;create_TOK_CYL(segs,,height#,radius#,xp#,yp#,zp#,angdamp#,lindamp#,mass#,IT1#,IT2#,IT3#,texture)
	create_TOK_BALL(12,4,0,6,0,0.002,0.001,2.0,1.0,.5,spheretex,"ball3")
	
	
	create_TOK_BOX(4,2,4,0,8,0,0.001,0.002,2,2,2,2,imass#,cubetex,"box2")
	
	create_TOK_BOX(2,2,2,0,8,-4,0.01,0.0002,2,2,2,2,imass#,cubetex,"box3")

			 
   			
	 
	
	
	 


; add--------------------------------------------------------------------------

Centerpivot = CreatePivot()

light=CreateLight()
PositionEntity light,7,15,-5
PointEntity light,Centerpivot

rot#=0

period=600/FPS
time=MilliSecs()-period

imptime=MilliSecs()

camx#=Cos(rot#)*50
camz#=Sin(rot#)*50

;rot#=rot#+0.05

If rot#>360 Then rot#=0

PositionEntity campiv,camx#,40,camz#
PointEntity campiv,centerpivot  


; +++ MAIN LOOP START ++++++ MAIN LOOP START ++++++ MAIN LOOP START ++++++ MAIN LOOP START +++
While Not KeyHit(1)

	Repeat
		elapsed=MilliSecs()-time
	Until elapsed

	ticks=elapsed/period
	tween#=Float(elapsed Mod period)/Float(period)

	For k=1 To ticks
		time=time+period
		If k=ticks Then CaptureWorld

		TOKSIM_Advance(1.75/FPS)

move_camera()

	UpdateWorld

	Next

; Not sure wether to put this here or inside the for/next above...
For i=1 To TOKS
 If TOKRB_IsIdle(rb(i)) Then
  EntityAlpha obj(i),0.5
 Else
  EntityAlpha obj(i),1.0
  TOKRB_Active(rb(i),True)

 EndIf
 
 If EntityName(obj(i)) = "ball"
	; do stuff
 EndIf

 If EntityName(obj(i)) = "box"
	;If MouseDown(2) = 1 Then TOKRB_ApplyTwist(rb(i),0,150,0)
 EndIf

	If MouseDown(2) = 1 Then place_rb(cubetex)

 PositionEntity obj(i),TOKRB_GetX#(rb(i)),TOKRB_GetY#(rb(i)),TOKRB_GetZ#(rb(i)) 
 RotateEntity obj(i),TOKRB_GetPitch#(rb(i)),TOKRB_GetYaw#(rb(i)),TOKRB_GetRoll#(rb(i)),False
Next

If MouseDown(1)=1 Then push_rigid_body()


RenderWorld tween
Color 255,255,255
Text 0,0,"Physics Time:"+TOKSIM_GetPhysicsTime()*1000.0+ " milliseconds"
Text 0,10,"Render Time:"+Str(elapsed)+ " milliseconds"
Text 0,20,"pnx"+pnx#+"  pny "+pny#+"  pnz  "+pnz# 
;Text 0,30,"Render Time:"+Str(elapsed)+ " milliseconds"
Text 0,40,"pitch:"+EntityPitch(campiv)
;Text 0,50,"Render Time:"+Str(elapsed)+ " milliseconds"

Color 255,0,0
Rect midw-4,midh-4,8,8,0
	Flip False

Wend

; == MAIN LOOP END ==== MAIN LOOP End ==== MAIN LOOP End ==== MAIN LOOP End ==== MAIN LOOP End ==


TOKSIM_DestroySimulator()

End

;==================================================================================
Function curvevalue#(newvalue#,oldvalue#,increments# )
	If increments>1 Then oldvalue#=oldvalue#-(oldvalue#-newvalue#)/increments
	If increments<=1 Then oldvalue=newvalue
	Return oldvalue#
End Function
;==================================================================================
Function move_camera()
	; Movement controls
	If KeyDown(w)=1 Then speed# = speed#+.03
	If KeyDown(a)=1 Then latspeed# = latspeed# - .02
	If KeyDown(s)=1 Then speed# = speed# -.03
	If KeyDown(d)=1 Then latspeed# = latspeed# + .02

latspeed#=latspeed#*.98
speed#=speed#*.98

MY#=curvevalue#(MouseYSpeed(),MY#,3 )
MX#=curvevalue#(MouseXSpeed(),MX#,3 )
TurnEntity campiv,MY#,-MX#,0 ; turn camera up and down
;TurnEntity campiv,0,-MX#,0 ;  turn nnn left --right
RotateEntity campiv,EntityPitch(campiv),EntityYaw(campiv),0
If EntityPitch(campiv)>88 Then RotateEntity campiv,88,EntityYaw(campiv),EntityRoll(campiv)
If EntityPitch(campiv)<-88 Then RotateEntity campiv,-88,EntityYaw(campiv),EntityRoll(campiv)

MoveMouse 100,100

MoveEntity campiv,latspeed#,0,speed#
	


End Function
;==================================================================================
Function create_cube_texture()
	tex = CreateTexture(64,64)
	ScaleTexture tex,.5,.5
	SetBuffer TextureBuffer(tex)
		Color 20,20,200
		Rect 0,0,64,64
		Color 255,255,255
		Rect 0,0,32,32
		Rect 32,32,64,64
		Color 0,0,0
		Rect 0,0,64,64,0
	SetBuffer BackBuffer()
	Return tex
	
End Function

Function create_world_texture()
	tex = CreateTexture(128,128)
	ScaleTexture tex,.25,.25
	SetBuffer TextureBuffer(tex)
		Color 100,100,100
		Rect 0,0,128,128
		Color 50,50,50
		Rect 0,0,64,64
		Rect 64,64,128,128
		Color 200,200,0
		Rect 0,0,128,128,0
		

	SetBuffer BackBuffer()
	Return tex
	
End Function

;==================================================================================
Function create_sphere_texture()
	tex = CreateTexture(128,128)
	SetBuffer TextureBuffer(tex)
		Color 0,200,0
		Rect 0,0,128,128
		Color 255,255,0
		Rect 0,0,64,64
		Rect 64,64,128,128
		Color 0,0,0
		Rect 0,0,64,64,0
		Color 0,0,0
		Rect 64,64,128,128,0
		Color 0,0,0
		Rect 0,0,128,128,0
	ScaleTexture tex,.5,.5


	SetBuffer BackBuffer()
	Return tex

	
End Function

;==================================================================================
Function create_cyl_texture()
	tex = CreateTexture(128,128)
	SetBuffer TextureBuffer(tex)
		Color 0,0,0
		Rect 0,0,128,128
		Color 255,0,0
		Rect 0,0,64,64
		Rect 64,64,128,128
	SetBuffer BackBuffer()
	Color 255,255,0 ; YELLOW
	Return tex

	
End Function

;==================================================================================
Function campick()
	pictentity = 0
	CameraPick(camera,midw,midh)
	pictentity = PickedEntity() 
	If Pictentity<>0
		
		;EntityAlpha pictentity,.7	
		pnx# = PickedNX#()
		pny# = PickedNY#()
		pnz# = PickedNZ#()	
		pcx# = PickedX#()
		pcy# = PickedY#()
		pcz# = PickedZ#()

	
	EndIf
	

End Function

Function create_TOK_BOX(xs#,ys#,zs#,xp#,yp#,zp#,damp#,angdamp#,mass#,iw#,ih#,id#,imass#,texture,name$)

			TOKS = TOKS+1
			If TOKS>ENTS 
				TOKS = ENTS
				Return
			EndIf
			obj(TOKS) = CreateCube()
			NameEntity obj(toks),name$
			ScaleEntity obj(TOKS),xs#/2,ys#/2,zs#/2
			EntityPickMode obj(TOKS),2
			EntityTexture obj(TOKS),texture
			rb(TOKS) = TOKRB_Create()
			TOKRB_SetSleepingParameter(rb(TOKS),-100)
			TOKRB_AddBox rb(TOKS),xs#,ys#,zs#
			TOKRB_SetPosition(rb(TOKS),xp#,yp#,zp#)
			TOKRB_SetLinearDamping rb(TOKS),damp#
			TOKRB_SetAngularDamping rb(TOKS),angdamp# 

			TOKRB_SetMass rb(TOKS),mass#
			TOKRB_SetBoxInertiaTensor rb(TOKS),iw#,ih#,id#,imass# 
			
			

End Function

Function create_TOK_BALL(segs,sc#,xp#,yp#,zp#,angdamp#,lindamp#,mass#,IT1#,IT2#,texture,name$)
			  TOKS = TOKS+1
			  
				If TOKS>ENTS 
					TOKS = ENTS
					Return
				EndIf
	
			
				obj(TOKS) = CreateSphere(segs)
				NameEntity obj(toks),name$

			  ScaleEntity obj(TOKS),sc#/2,sc#/2,sc#/2
			  EntityPickMode obj(TOKS),2

			  EntityTexture obj(TOKS),texture
			  rb(TOKS) = TOKRB_Create()
			  TOKRB_AddSphere rb(TOKS),sc#
			  TOKRB_SetPosition(rb(TOKS),xp#,yp#,zp#)
			  TOKRB_SetAngularDamping rb(TOKS),angdamp# 
			  TOKRB_SetLinearDamping rb(TOKS),lindamp#
			  TOKRB_SetMass rb(TOKS),mass#
			  TOKRB_SetSphereInertiaTensor rb(TOKS),IT1#,IT2#  
End Function



Function create_TOK_CYL(segs,height#,radius#,xp#,yp#,zp#,angdamp#,lindamp#,mass#,IT1#,IT2#,IT3#,texture)

			TOKS = TOKS+1
			  
				If TOKS>ENTS 
					TOKS = ENTS
					Return
				EndIf
			
			obj(TOKS) = CreateCylinder(segs)
 				EntityPickMode obj(TOKS),2
  			 EntityTexture obj(TOKS),texture
			  rb(TOKS) = TOKRB_Create()
			  TOKRB_AddCylinder rb(TOKS),height#,radius#
			  ScaleEntity obj(TOKS),radius#/1.95,height#,radius#/1.95
			  TOKRB_SetPosition(rb(TOKS),xp#,yp#,zp#)
			  TOKRB_SetAngularDamping rb(TOKS),angdamp# 
			  TOKRB_SetLinearDamping rb(TOKS),lindamp#
			  TOKRB_SetMass rb(TOKS),mass#
			  TOKRB_SetCylinderInertiaTensor rb(TOKS),IT1#,IT2#,IT3#  
End Function
;==================================================================================

Function place_rb(tex)
	
		campick()
		If pictentity>0
			PositionEntity pickmarker,pcx#,pcy#,pcz#
			;create_TOK_BOX(xs#,ys#,zs#,xp#,yp#,zp#,damp#,angdamp#,mass#,iw#,ih#,id#,imass#,texture,name$)
	
			create_TOK_BOX(4,4,4,pcx#,pcy#+2,pcz#,0.001,0.002,2,4,4,4,2,tex,"foo")
			Repeat : Until MouseDown(2) = 0
	 	EndIf
End Function
		
;==================================================================================



;==================================================================================

Function push_rigid_body()
	
		campick()
	 	For n = 1 To TOKS
			If pictentity = obj(n)
				i = n
				
				If KeyDown(29) Or KeyDown(157)
				
					TOKRB_ApplyImpulse2 rb(i),-pnx#*15,-pny#*15,-pnz#*15,pcx#,pcy#,pcz# 
				Else
					TOKRB_ApplyImpulse2 rb(i),-pnx#,-pny#,-pnz#,pcx#,pcy#,pcz# 				;TOKRB_ApplyImpulse rb(i),-pnx#,pny#,-pnz#
				EndIf
			EndIf
		Next		
End Function
		
;==================================================================================


Function MakeTokCollider(mesh)
 scount=CountSurfaces(mesh)
 For ind=1 To scount
  surface=GetSurface(mesh,ind)
  ttltris=ttltris+CountTriangles(surface)
  ttlvert=ttlvert+CountVertices(surface)
 Next
 vertices=CreateBank(16*ttlvert)
 triangles=CreateBank(24*ttltris)
 offsetv=0
 offsett=0
 For ind=1 To scount
  surface = GetSurface(mesh,ind)
  ctr=CountTriangles(surface)
  tric=tric+cvt
  cvt=CountVertices(surface)
  ;fill bank with vertices
  For v=0 To cvt-1
   PokeFloat vertices,offsetv,VertexX#(surface,v)
   PokeFloat vertices,offsetv+4,VertexY#(surface,v)
   PokeFloat vertices,offsetv+8,VertexZ#(surface,v)
   PokeFloat vertices,offsetv+12,0.0
   offsetv=offsetv+16
  Next
  ;fill bank with triangles
  For v=0 To ctr-1
   PokeInt triangles,offsett,tric+TriangleVertex(surface,v,0)
   PokeInt triangles,offsett+4,tric+TriangleVertex(surface,v,1)
   PokeInt triangles,offsett+8,tric+TriangleVertex(surface,v,2)
   PokeInt triangles,offsett+12,0
   PokeInt triangles,offsett+16,0
   PokeInt triangles,offsett+20,0
   offsett=offsett+24
  Next
 Next
 ;Hand over the terrain data to Tokamak
 TOKSIM_SetTerrainMesh vertices,ttlvert,triangles,ttltris
 ; Now we can free the banks as Tokamak has copied all data
 FreeBank vertices
 FreeBank triangles
End Function



Beaker(Posted 2004) [#2]
Which version of Tokamak does this use?

Might be worth posting this here:
http://playerfactory.proboards25.com/index.cgi?board=tokamak
so that it's not lost in the Blitz forum sands of time.


IPete2(Posted 2004) [#3]
Bradford,

Brilliant man! I was wondering if you could attach stuff - Im thinking vehicles! He he he.

IPete2.


EOF(Posted 2004) [#4]
This Tokamak stuff seems to be pretty awesome. Lets hope it can become some sort of official expansion for Blitz3D.

In fact, why not a separate forum?

I'm not up to speed on physics but how does Tokamak compare with Vivid Images Actor Demo ?


BlitzSupport(Posted 2004) [#5]
Excellent!


Shambler(Posted 2004) [#6]
Very nice, I'm going to start putting this in my game soon.

Something that needs loking at , I did manage to push the small box through the floor.


fredborg(Posted 2004) [#7]
Good fun!

But I'm not the one who did that maketokcollider function :D I made another one, though :)


Shambler(Posted 2004) [#8]
Once you use TOKSIM_SetTerrainMesh is it possible to enable and disable this mesh for collision?

Also there seems to be a limit for

Const ENTS=100	; TOTAL NUMBER OF TOKAMAKPHYSICS ENTITIES


is this a tokamak limit or a limitation with the wrapper?


Gabriel(Posted 2004) [#9]
I think I read in another thread that number if the maximum number of Tokamak Physics Entities you will ever have. I'm assuming Tokamak puts asisde memory for them right at the start.


Shambler(Posted 2004) [#10]
I just checked the wrapper and the maximum number should be 32K but it crashes with a MAV with less than 10,000.


bradford6(Posted 2004) [#11]
doesnt matter, blitz can't render 10,000 entities. the bottleneck is in the materials handler i suppose.

for most practical purposes, 50-100 entities should be sufficient.


Bot Builder(Posted 2004) [#12]
How bout sending this demo, and some of the other demos (compiled and upxed) to the tokomak guys? they'd probably think it was cool and might even use it to show off tokomak's abilities :)

I'll put up a zip of some of the 'cool ones'(nearly all of them;especially bradford's and the bowling) on my website and put a forum post on the official tokamak forums if yah like.


bradford6(Posted 2004) [#13]
yeah, go ahead Bot. I'll send you more of my demos if you like.


Bot Builder(Posted 2004) [#14]
k. coo.
[edit] Yeah, sure, why not? I'll put in ones I think are good. so far I've got the catapult, bowling, the galloping demo, and the original room demo. Anymore I should put in?


BlitzSupport(Posted 2004) [#15]
Where's the bowling example? Sure that's not Vorderman's ODE demo?


Bot Builder(Posted 2004) [#16]
It's voderman's demo but ported to tokomak by The Crow - http://playerfactory.proboards25.com/index.cgi?board=tokamak&action=display&num=1075077657

I think it's a bit better physics, personally.