Seite 4 von 4

Re: RagDoll Ogre PhysikEngine

Verfasst: 23.07.2025 14:07
von bobobo
version die auch mit pb 6.41 rennt
leg folgendes mal ins examples 3d verzeichnis

(windows getestet, ob was anderes läuft weiß ich nicht)

Code: Alles auswählen

;
; ------------------------------------------------------------
;
;   PureBasic - RagDoll fuer Purebasic ab 6.20
;
;    (c) 2002 - Fantaisie Software , bobobo
; 
; das Programm sollte im Verzeichnis  \Examples\3D liegen
; weil ich das sol will
; alles ohne Gewähr
; ------------------------------------------------------------
;

#CameraSpeed = 1



Define.f KeyX, KeyY, MouseX, MouseY ,rott, moveit, I_f
Define.i Knupf1,knupf2, Knupf3 , hands 


Structure components
  nodeid.i:ball.i:limb.i:texture.i:Bodymesh.i:Body.i:HeadMesh.i:Head.i
  Nose.i:eyer.i:eyel.i:mouth.i:earl.i:earr.i:arml.i:armlu.i:armr.i:armru.i
  legl.i:leglu.i:legr.i:legru.i:footl.i:footr.i:ct_bodyhead.i:ct_arml.i
  hinge_arml.i:ct_armr.i:hinge_armr.i:hinge_legl.i:hinge_leglu.i:hinge_legr.i
  hinge_legru.i:posx.i:posy.i:posz.i
EndStructure

Define ragdoll.components
Global NewList ragdolls.components()

Structure blood
  id.i
  time.i
EndStructure

bloodygameheight=340
NewList blood.blood()

Procedure killjoints()
  
  ForEach ragdolls()
    FreeJoint(#PB_All)
  Next
  
EndProcedure

Procedure makejoints()
  ;joints
  ForEach ragdolls()
    RotateEntity(ragdolls()\Head,0,0,0,#PB_Absolute)
    RotateEntity(ragdolls()\body,0,0,0,#PB_Absolute)
    RotateEntity(ragdolls()\arml,0,0,0,#PB_Absolute)
    RotateEntity(ragdolls()\armlu,0,0,0,#PB_Absolute)
    RotateEntity(ragdolls()\armr,0,0,0,#PB_Absolute)
    RotateEntity(ragdolls()\armru,0,0,0,#PB_Absolute)
    RotateEntity(ragdolls()\legl,0,0,0,#PB_Absolute)
    RotateEntity(ragdolls()\leglu,0,0,0,#PB_Absolute)
    RotateEntity(ragdolls()\legr,0,0,0,#PB_Absolute)
    RotateEntity(ragdolls()\legru,0,0,0,#PB_Absolute)
    
    ragdolls()\ct_bodyhead=ConeTwistJoint(#PB_Any,EntityID(ragdolls()\Body)  , 0, 0.7,0,EntityID(ragdolls()\Head) ,0,-0.4,0)
    ;ragdolls()\ct_bodyhead=PointJoint(#PB_Any,EntityID(ragdolls()\Body)  , 0, 0.7,0,EntityID(ragdolls()\Head) ,0,-0.4,0)
    
    ragdolls()\ct_arml     = ConeTwistJoint(#PB_Any,EntityID(ragdolls()\Body),-0.6,  0.5 ,0,EntityID(ragdolls()\arml)       , 0, 0.4,0)
    ragdolls()\hinge_arml  = HingeJoint(#PB_Any,EntityID(ragdolls()\arml)    ,   0, -0.45,0,1,0,0,EntityID(ragdolls()\armlu), 0,0.45,0,1,0,0)
    
    ragdolls()\ct_armr     = ConeTwistJoint(#PB_Any,EntityID(ragdolls()\Body), 0.6, 0.5,0,EntityID(ragdolls()\armr),        0, 0.4,0)
    ragdolls()\hinge_armr  = HingeJoint(#PB_Any,EntityID(ragdolls()\armr)    , 0  ,-0.45,0,1,0,0,EntityID(ragdolls()\armru), 0,0.45,0,1,0,0)
    
    ragdolls()\hinge_legl  = HingeJoint(#PB_Any,EntityID(ragdolls()\Body)    ,-0.3,-0.60,0,1,0,0,EntityID(ragdolls()\legl) , 0,0.40,0,1,0,0)
    ragdolls()\hinge_legr  = HingeJoint(#PB_Any,EntityID(ragdolls()\Body)    , 0.3,-0.60,0,1,0,0,EntityID(ragdolls()\legr) , 0,0.40,0,1,0,0)
    ragdolls()\hinge_leglu = HingeJoint(#PB_Any,EntityID(ragdolls()\legl)    ,   0,-0.45,0,1,0,0,EntityID(ragdolls()\leglu), 0,0.45,0,1,0,0)
    ragdolls()\hinge_legru = HingeJoint(#PB_Any,EntityID(ragdolls()\legr)    ,   0,-0.45,0,1,0,0,EntityID(ragdolls()\legru), 0,0.45,0,1,0,0)
    
    ;joints attributes       
    SetJointAttribute(ragdolls()\ct_bodyhead,#PB_ConeTwistJoint_SwingSpan,0.5)
    SetJointAttribute(ragdolls()\ct_bodyhead,#PB_ConeTwistJoint_SwingSpan2,0.5)
    SetJointAttribute(ragdolls()\ct_bodyhead,#PB_ConeTwistJoint_TwistSpan,0.5)
    ;       ;          
    SetJointAttribute(ragdolls()\ct_arml,#PB_ConeTwistJoint_SwingSpan ,0.2);seitl
    SetJointAttribute(ragdolls()\ct_arml,#PB_ConeTwistJoint_SwingSpan2,1)  ;dreh
    SetJointAttribute(ragdolls()\ct_arml,#PB_ConeTwistJoint_TwistSpan ,2)  ;vorzurück
                                                                           ;       ;          
    SetJointAttribute(ragdolls()\hinge_arml,#PB_HingeJoint_LowerLimit,0)
    SetJointAttribute(ragdolls()\hinge_arml,#PB_HingeJoint_UpperLimit,120)
    SetJointAttribute(ragdolls()\hinge_armr,#PB_HingeJoint_LowerLimit,0)
    SetJointAttribute(ragdolls()\hinge_armr,#PB_HingeJoint_UpperLimit,120)
    
    SetJointAttribute(ragdolls()\ct_armr,#PB_ConeTwistJoint_SwingSpan,0.2);seitlich
    SetJointAttribute(ragdolls()\ct_armr,#PB_ConeTwistJoint_SwingSpan2,1) ;dreh
    SetJointAttribute(ragdolls()\ct_armr,#PB_ConeTwistJoint_TwistSpan,2)  ;vorzurück
    
    SetJointAttribute(ragdolls()\hinge_legl,#PB_HingeJoint_LowerLimit,-1)
    SetJointAttribute(ragdolls()\hinge_legl,#PB_HingeJoint_UpperLimit,120)
    SetJointAttribute(ragdolls()\hinge_legr,#PB_HingeJoint_LowerLimit,-1)
    SetJointAttribute(ragdolls()\hinge_legr,#PB_HingeJoint_UpperLimit,120)
    
    SetJointAttribute(ragdolls()\hinge_leglu,#PB_HingeJoint_LowerLimit,-120)
    SetJointAttribute(ragdolls()\hinge_leglu,#PB_HingeJoint_UpperLimit,1)
    SetJointAttribute(ragdolls()\hinge_legru,#PB_HingeJoint_LowerLimit,-120)
    SetJointAttribute(ragdolls()\hinge_legru,#PB_HingeJoint_UpperLimit,1)
  Next
EndProcedure

InitEngine3D()

InitSprite()
InitKeyboard()
InitMouse()

ExamineDesktops():dx=DesktopWidth(0)*0.8:dy=DesktopHeight(0)*0.8
OpenWindow(0, 0,0, DesktopUnscaledX(dx),DesktopUnscaledY(dy), "Camera - [Esc] quit",#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, dx, dy, 0, 0, 0)

Add3DArchive(#PB_Compiler_Home + "/Examples/3D/" +"Data/Textures", #PB_3DArchive_FileSystem)

Add3DArchive(#PB_Compiler_Home + "/Examples/3D/" +"Data/Packs/desert.zip", #PB_3DArchive_Zip)
Parse3DScripts()

InitSprite()
InitKeyboard()
InitMouse()


;WorldShadows(#PB_Shadow_Additive,512)
SkyBox("desert07.jpg")
camera=CreateCamera(#PB_Any,0,0,100,100)
;CameraRenderMode(camera, #PB_Camera_Plot)
MoveCamera(camera,0, 260 ,15, #PB_Absolute)

texture1t=CreateTexture(#PB_Any,512,512)
font=LoadFont(#PB_Any,"",14,#PB_Font_HighQuality)
StartDrawing(TextureOutput(texture1t))
DrawingFont(FontID(font))
Box(0, 0, 512, 512, RGBA(222,222,255, 200))
For l=0 To 128 
  Circle(Random(512),Random(512),Random(4)+1,RGBA(128,128,255,255))
Next l
DrawingMode(#PB_2DDrawing_Transparent)

FrontColor(#Black)
;BackColor(#Black)
th=TextHeight("X")
ty=0
DrawText(0, 0,"V:Hands OFF/ON (**)")
ty+th
DrawText(0,ty,"U:IdiotDance OFF/ON (**)")
ty+th
DrawText(0,ty,"R:reset (*)")
ty+th
DrawText(0,ty,"B:BloodyGame (**)")
ty+th
DrawText(0,ty,"BloodyGameHeight N:increase , M: decrease (*)")
ty+th
DrawText(0,ty,"T:upright (*)")
ty+th
DrawText(0,ty,"H:hail (*), G:strange (*)")
ty+th
DrawText(0,ty,"T: upright (*)")
ty+th
DrawText(0,ty,"F:forceup (near plate) (trampoline) (*)")
ty+th
DrawText(0,ty,"J:forceup (*)")
ty+th
DrawText(0,ty,"P:LookatAll (*)")
ty+th
DrawText(0,ty,"S:Shoot (**)")
ty+th
DrawText(0,ty,"L:Disassemble , O: Assemble (**)")
ty+th
DrawText(0,ty,"1,2,3,4,6,8 turns head (*)")
ty+th
DrawText(0,ty,"Add:Gravitiy decrease")
ty+th
DrawText(0,ty,"Sub:Gravitiy increase")
ty+th
DrawText(0,ty,"Q:Quakemode, Hello Newzealand")
ty+th
DrawText(0,ty,"(*) while pressed,  (**) when release key")
;Debug ty
StopDrawing()

texture1=CreateMaterial(#PB_Any, TextureID(texture1t))

texture2=CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(texture2))
DrawingMode(#PB_2DDrawing_AlphaBlend)
Box(0,0,256,256,RGBA(0,0,0,0))

DrawingFont(FontID(font))

;FrontColor(RGBA(0,0,0,255))
DrawText(0,0,"Press B and have fun",RGBA(255,255,0,255),RGBA(0,0,0,0))

DrawText(0,50,"Hold N for a time and press B",RGBA(255,255,0,255),RGBA(0,0,0,0))
DrawText(0,70,"and have even more fun",RGBA(255,255,0,255),RGBA(0,0,0,0))
StopDrawing()
infomat=CreateMaterial(#PB_Any,TextureID(texture2))
MaterialBlendingMode(infomat,#PB_Material_AlphaBlend)

texture2= CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(texture2))
Box(0,0,256,256,RGBA(80,80,80,180))

For l=0 To 400
  Circle(Random(256),Random(256),Random(3)+1,RGBA(Random(5)+100,Random(5)+100,Random(5)+100,180))
Next l

DrawText(0,0,"ragdoll ®",RGBA(255,0,0,255),RGBA(80,80,80,222))
StopDrawing()

texture2=CreateMaterial(#PB_Any, TextureID(texture2))

textureblue = CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(textureblue))
Box(0,0,256,256,#White)
Ellipse(  0,128,25,50,RGB(30, 144, 255))
Ellipse(256,128,25,50,RGB(30, 144, 255))
Ellipse(  0,128,10,20,RGB(0 ,   0,   0))
Ellipse(256,128,10,20,RGB(0 ,   0,   0))
StopDrawing()
MatEye = CreateMaterial(#PB_Any,TextureID(textureblue))

texturedead = CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(texturedead))
Box(0,0,256,256,#White)
For de=0 To 10
  Line(0,128+de,256,1,#Black)
  Line(0,128-de,256,1,#Black)
Next

For de=0 To 10
  Line(de,0,1,256,#Black)
  Line(256-de,0,1,256,#Black)
  
Next

StopDrawing()
MatDeadEye = CreateMaterial(#PB_Any,TextureID(texturedead))

textureflesh = CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(textureflesh))
Box(0,0,256,256,RGB(255, 218, 185))
For f=0 To 512
  Circle(Random(255),Random(255),Random(2),RGB(243, 208, 161))
Next

StopDrawing()
MatFlesh = CreateMaterial(#PB_Any,TextureID(textureflesh))

texturemouth = CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(texturemouth))
Box(0,0,256,256,#White)
For t=0 To 256 Step 16
  Line(t,0,1,256,#Black)
  Line(t-1,0,1,256,#Black)
  Line(t-2,0,1,256,#Black)
  Line(t+1,0,1,256,#Black)
  Line(t+2,0,1,256,#Black)
Next t

StopDrawing()
MatMouth = CreateMaterial(#PB_Any,TextureID(texturemouth))

texturekontakt= CreateTexture(#PB_Any,256,256)

StartDrawing(TextureOutput(texturekontakt))
DrawingMode(#PB_2DDrawing_AlphaBlend)
Box(0,0,256,256,RGBA(0,0,0,0))
For c=1 To 32
  bx=64+Random(128)
  by=64+Random(128)
  br=Random(32)
  Circle(bx,by,br,RGBA(255,0,0,br*4))
Next c

StopDrawing()

MatKontakt = CreateMaterial(#PB_Any,TextureID(texturekontakt))

MaterialBlendingMode(MatKontakt,#PB_Material_AlphaBlend)
RotateMaterial(MatKontakt,0.005,#PB_Material_Animated)
AddMaterialLayer(MatKontakt,TextureID(texturekontakt),#PB_Material_Add)

Bodymesh = CreateCube(#PB_Any,1)
LimbMesh = CreateCylinder(#PB_Any, 0.1 ,0.80)

HeadMesh  = CreateSphere(#PB_Any , 0.5); ,12,12)
NoseMesh  = CreateSphere(#PB_Any , 0.25, 3, 4)
EyeMeshl  = CreateSphere(#PB_Any , 0.10);,8,8)
EyeMeshr  = CreateSphere(#PB_Any , 0.10);,8,8)
MouthMesh = CreateSphere(#PB_Any , 0.25,15,15)
EarMeshl =  CreateSphere(#PB_Any , 0.25);,8,8)
EarMeshr =  CreateSphere(#PB_Any , 0.25);,8,8)
FootMeshl = CreateSphere(#PB_Any , 0.25,6,6)
FootMeshr = CreateSphere(#PB_Any , 0.25,6,6)

kontaktMesh= CreatePlane(#PB_Any,0.25,0.25,1,1,1,1)
TransformMesh(kontaktMesh,0,0.05,0,1,1,1,0,0,0)
kontakt=CreateEntity(#PB_Any,MeshID(kontaktMesh),MaterialID(MatKontakt))
EntityRenderMode(kontakt, #PB_Entity_CastShadow)


TransformMesh(NoseMesh , 0.00, 0.00, 0.50, 1.00, 1.00, 1.00,  0.00,  0.00, 0.00)
TransformMesh(EyeMeshl ,-0.35, 0.20, 0.25, 1.00, 1.00, 1.00,  0.00,  0.00, 0.00)
TransformMesh(EyeMeshr , 0.35, 0.20, 0.25, 1.00, 1.00, 1.00,  0.00,  0.00, 0.00)
TransformMesh(MouthMesh, 0.00,-0.15, 0.22, 1.50, 0.45, 1.00, 40.00,  0.00,  0.00)
TransformMesh(EarMeshl ,-0.50,-0.10,-0.20, 1.00, 1.00, 0.25,  0.00,  0.00,  0.00)
TransformMesh(EarMeshr , 0.50,-0.10,-0.20, 1.00, 1.00, 0.25,  0.00,  0.00,  0.00)
TransformMesh(FootMeshl,-0.02,-0.38, 0.15, 0.50, 0.25, 1.00, 10.00, 20.00,  0.00)
TransformMesh(FootMeshr, 0.02,-0.38, 0.15, 0.50, 0.25, 1.00, 10.00,-20.00,  0.00)

For r=1 To 8 ;3 Dinger
  
  AddElement(ragdolls())
  
  ragdolls()\posx=r*2-2
  ragdolls()\posy=259 ;height
  ragdolls()\posz=0
  
  ragdolls()\texture=texture2
  
  ;bodyparts
  
  ragdolls()\Body=CreateEntity(#PB_Any,MeshID(Bodymesh),MaterialID(ragdolls()\texture),ragdolls()\posx,ragdolls()\posy,ragdolls()\posz)
  ScaleEntity(ragdolls()\Body,1.0,1,0.25)
  
  ragdolls()\Nose  = CreateEntity(#PB_Any,MeshID(NoseMesh) ,MaterialID(MatFlesh))
  ragdolls()\eyel  = CreateEntity(#PB_Any,MeshID(EyeMeshl) ,MaterialID(MatEye))
  ragdolls()\eyer  = CreateEntity(#PB_Any,MeshID(EyeMeshr) ,MaterialID(MatEye))
  ragdolls()\mouth = CreateEntity(#PB_Any,MeshID(MouthMesh),MaterialID(MatMouth))
  ragdolls()\earl  = CreateEntity(#PB_Any,MeshID(EarMeshl) ,MaterialID(MatFlesh))
  ragdolls()\earr  = CreateEntity(#PB_Any,MeshID(EarMeshr) ,MaterialID(MatFlesh))
  
  ragdolls()\Head = CreateEntity(#PB_Any,MeshID(HeadMesh),MaterialID(MatFlesh),  ragdolls()\posx,ragdolls()\posy+1,ragdolls()\posz)
  AttachEntityObject(ragdolls()\Head,"",EntityID(ragdolls()\Nose) ,0,0,0,0,0,0)
  AttachEntityObject(ragdolls()\Head,"",EntityID(ragdolls()\eyel) ,0,0,0,0,0,0)
  AttachEntityObject(ragdolls()\Head,"",EntityID(ragdolls()\eyer) ,0,0,0,0,0,0)
  AttachEntityObject(ragdolls()\Head,"",EntityID(ragdolls()\mouth),0,0,0,0,0,0)
  AttachEntityObject(ragdolls()\Head,"",EntityID(ragdolls()\earl) ,0,0,0,0,0,0)
  AttachEntityObject(ragdolls()\Head,"",EntityID(ragdolls()\earr) ,0,0,0,0,0,0)
  
  ragdolls()\arml  = CreateEntity(#PB_Any,MeshID(LimbMesh),MaterialID(ragdolls()\texture) ,ragdolls()\posx-0.6,ragdolls()\posy,ragdolls()\posz)
  ragdolls()\armlu = CreateEntity(#PB_Any,MeshID(LimbMesh),MaterialID(ragdolls()\texture) ,ragdolls()\posx-0.6,ragdolls()\posy-1,ragdolls()\posz)
  ragdolls()\armr  = CreateEntity(#PB_Any,MeshID(LimbMesh),MaterialID(ragdolls()\texture) ,ragdolls()\posx+0.6,ragdolls()\posy,ragdolls()\posz)
  ragdolls()\armru = CreateEntity(#PB_Any,MeshID(LimbMesh),MaterialID(ragdolls()\texture) ,ragdolls()\posx+ 0.6,ragdolls()\posy-1,ragdolls()\posz)
  
  ragdolls()\legl = CreateEntity(#PB_Any,MeshID(LimbMesh),MaterialID(ragdolls()\texture)  ,ragdolls()\posx-0.3,ragdolls()\posy-1,ragdolls()\posz)
  ragdolls()\legr = CreateEntity(#PB_Any,MeshID(LimbMesh),MaterialID(ragdolls()\texture)  ,ragdolls()\posx+ 0.3,ragdolls()\posy-1,ragdolls()\posz)
  
  ragdolls()\leglu = CreateEntity(#PB_Any,MeshID(LimbMesh),MaterialID(ragdolls()\texture) ,ragdolls()\posx-0.3,ragdolls()\posy-2,ragdolls()\posz)
  ragdolls()\legru = CreateEntity(#PB_Any,MeshID(LimbMesh),MaterialID(ragdolls()\texture) ,ragdolls()\posx+ 0.3,ragdolls()\posy-2,ragdolls()\posz)
  ragdolls()\footl = CreateEntity(#PB_Any,MeshID(FootMeshl),MaterialID(ragdolls()\texture))
  
  AttachEntityObject(ragdolls()\leglu,"",EntityID(ragdolls()\footl) ,0,0,0,0,0,0)
  ragdolls()\footr = CreateEntity(#PB_Any,MeshID(FootMeshr),MaterialID(ragdolls()\texture))
  
  AttachEntityObject(ragdolls()\legru,"",EntityID(ragdolls()\footr) ,0,0,0,0,0,0)
  
  ;rendermode=#PB_Entity_CastShadow
  ;rendermode=#PB_Entity_CastShadow|#PB_Entity_DisplaySkeleton
  
  ;bodyPhysics
  CreateEntityBody(ragdolls()\Body,#PB_Entity_BoxBody  ,10, 0,1)
  EntityRenderMode(ragdolls()\Body, #PB_Entity_CastShadow)
  
  EntityRenderMode(ragdolls()\Head, #PB_Entity_CastShadow)
  CreateEntityBody(ragdolls()\Head, #PB_Entity_ConvexHullBody, 5, 0.25, 1)
  
  EntityRenderMode(ragdolls()\arml, #PB_Entity_CastShadow) 
  CreateEntityBody(ragdolls()\arml, #PB_Entity_CylinderBody,  1, 0 ,1)
  EntityRenderMode(ragdolls()\armlu, #PB_Entity_CastShadow) 
  CreateEntityBody(ragdolls()\armlu, #PB_Entity_CylinderBody, 1, 0, 1)
  
  EntityRenderMode(ragdolls()\armr, #PB_Entity_CastShadow) 
  CreateEntityBody(ragdolls()\armr, #PB_Entity_CylinderBody,  1, 0, 1)
  EntityRenderMode(ragdolls()\armru, #PB_Entity_CastShadow) 
  CreateEntityBody(ragdolls()\armru, #PB_Entity_CylinderBody, 1, 0,1)
  
  EntityRenderMode(ragdolls()\legl, #PB_Entity_CastShadow) 
  CreateEntityBody(ragdolls()\legl, #PB_Entity_CylinderBody, 1, 0,1)
  EntityRenderMode(ragdolls()\leglu, #PB_Entity_CastShadow) 
  CreateEntityBody(ragdolls()\leglu, #PB_Entity_CylinderBody,1, 0,1)
  
  EntityRenderMode(ragdolls()\legr, #PB_Entity_CastShadow) 
  CreateEntityBody(ragdolls()\legr, #PB_Entity_CylinderBody, 1, 0,1)
  EntityRenderMode(ragdolls()\legru, #PB_Entity_CastShadow) 
  CreateEntityBody(ragdolls()\legru, #PB_Entity_CylinderBody,1, 0,1)
Next 

makejoints()  
;
plate=CreateCube(#PB_Any,1)
ScaleMaterial(texture1,1,1)
RotateMaterial(texture1,90,#PB_Material_Fixed)
;boxes
;For r=1 To 600
;  b=CreateEntity(#PB_Any,MeshID(plate),MaterialID(texture1),Random(20)-10,270,Random(20)-10);,Random(1),Random(10)+274,Random(1))
;  ScaleEntity(b,0.2,3,0.2)
;  CreateEntityBody(b,#PB_Entity_BoxBody   ,05,0.01,100)
;Next r

platte=CreateEntity(#PB_Any,MeshID(plate),MaterialID(texture1),0,0,0)

;ScaleEntity(platte,70,0.01,70)
ScaleEntity(platte,70,0.5,70)
MoveEntity(platte,0,256,0) ; 256 plate height 
EntityRenderMode(platte, #PB_Entity_CastShadow)
CreateEntityBody(platte,#PB_Entity_StaticBody,1,1,0.5)

info=CreateEntity(#PB_Any,MeshID(plate),MaterialID(infomat),0,0,0)
ScaleEntity(info,10,0.01,10)
MoveEntity(info,5,260,0)
RotateEntity(info,90,0,0)
EntityRenderMode(info,  #PB_Entity_DisplaySkeleton )

suncolor=#White

sun=CreateLight(#PB_Any,suncolor,17830,12860,10930,#PB_Light_Point)

CameraLookAt(camera,EntityX(ragdolls()\Head),EntityY(ragdolls()\Head),EntityZ(ragdolls()\Head))
dance=1
hands=1

Repeat
  ;Debug hands
  
  ;Debug "************"
  
  ;Screen3DEvents()
  If ExamineMouse()
    MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
    MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
  EndIf
  
  If hands=1
    hands=2
    ;Debug hands  
    ;Händchenhalten    
    sp=-0.5
    tau.f=0
    damp.f=0.5
    SelectElement(ragdolls(),0)
    jx=EntityX(ragdolls()\armru)
    
    jy=EntityY(ragdolls()\armru)
    jz=EntityZ(ragdolls()\armru)
    id=EntityID(ragdolls()\armru)
    SelectElement(ragdolls(),1)
    jx1=EntityX(ragdolls()\armlu)
    jy1=EntityY(ragdolls()\armlu)
    jz1=EntityZ(ragdolls()\armlu)
    id1=EntityID(ragdolls()\armlu)
    knupf1=PointJoint(#PB_Any,id,0,sp,0,id1,0,sp,0)
    SetJointAttribute(knupf1,#PB_PointJoint_Damping,damp)
    SetJointAttribute(knupf1,#PB_PointJoint_Tau,tau)
    
    jx=EntityX(ragdolls()\armru)
    jy=EntityY(ragdolls()\armru)
    jz=EntityZ(ragdolls()\armru)
    id=EntityID(ragdolls()\armru)
    SelectElement(ragdolls(),2)
    jx1=EntityX(ragdolls()\armlu)
    jy1=EntityY(ragdolls()\armlu)
    jz1=EntityZ(ragdolls()\armlu)
    id1=EntityID(ragdolls()\armlu)
    knupf2=PointJoint(#PB_Any,id,0,sp,0,id1,0,sp,0)
    SetJointAttribute(knupf2,#PB_PointJoint_Damping,damp)
    SetJointAttribute(knupf2,#PB_PointJoint_Tau,tau)
    
    jx=EntityX(ragdolls()\armru)
    jy=EntityY(ragdolls()\armru)
    jz=EntityZ(ragdolls()\armru)
    id=EntityID(ragdolls()\armru)
    SelectElement(ragdolls(),3)
    jx1=EntityX(ragdolls()\armlu)
    jy1=EntityY(ragdolls()\armlu)
    jz1=EntityZ(ragdolls()\armlu)
    id1=EntityID(ragdolls()\armlu)
    knupf3=PointJoint(#PB_Any,id,0,sp,0,id1,0,sp,0)
    SetJointAttribute(knupf3,#PB_PointJoint_Damping,damp)
    SetJointAttribute(knupf3,#PB_PointJoint_Tau,tau)
    
    jx=EntityX(ragdolls()\armru)
    jy=EntityY(ragdolls()\armru)
    jz=EntityZ(ragdolls()\armru)
    id=EntityID(ragdolls()\armru)
    SelectElement(ragdolls(),4)
    jx1=EntityX(ragdolls()\armlu)
    jy1=EntityY(ragdolls()\armlu)
    jz1=EntityZ(ragdolls()\armlu)
    id1=EntityID(ragdolls()\armlu)
    knupf4=PointJoint(#PB_Any,id,0,sp,0,id1,0,sp,0)
    SetJointAttribute(knupf4,#PB_PointJoint_Damping,damp)
    SetJointAttribute(knupf4,#PB_PointJoint_Tau,tau)
    
    jx=EntityX(ragdolls()\armru)
    jy=EntityY(ragdolls()\armru)
    jz=EntityZ(ragdolls()\armru)
    id=EntityID(ragdolls()\armru)
    SelectElement(ragdolls(),5)
    jx1=EntityX(ragdolls()\armlu)
    jy1=EntityY(ragdolls()\armlu)
    jz1=EntityZ(ragdolls()\armlu)
    id1=EntityID(ragdolls()\armlu)
    knupf5=PointJoint(#PB_Any,id,0,sp,0,id1,0,sp,0)
    SetJointAttribute(knupf5,#PB_PointJoint_Damping,damp)
    SetJointAttribute(knupf5,#PB_PointJoint_Tau,tau)
    
    jx=EntityX(ragdolls()\armru)
    jy=EntityY(ragdolls()\armru)
    jz=EntityZ(ragdolls()\armru)
    id=EntityID(ragdolls()\armru)
    SelectElement(ragdolls(),6)
    jx1=EntityX(ragdolls()\armlu)
    jy1=EntityY(ragdolls()\armlu)
    jz1=EntityZ(ragdolls()\armlu)
    id1=EntityID(ragdolls()\armlu)
    knupf6=PointJoint(#PB_Any,id,0,sp,0,id1,0,sp,0)
    SetJointAttribute(knupf6,#PB_PointJoint_Damping,damp)
    SetJointAttribute(knupf6,#PB_PointJoint_Tau,tau)
    
    jx=EntityX(ragdolls()\armru)
    jy=EntityY(ragdolls()\armru)
    jz=EntityZ(ragdolls()\armru)
    id=EntityID(ragdolls()\armru)
    SelectElement(ragdolls(),7)
    jx1=EntityX(ragdolls()\armlu)
    jy1=EntityY(ragdolls()\armlu)
    jz1=EntityZ(ragdolls()\armlu)
    id1=EntityID(ragdolls()\armlu)
    knupf7=PointJoint(#PB_Any,id,0,sp,0,id1,0,sp,0)
    SetJointAttribute(knupf7,#PB_PointJoint_Damping,damp)
    SetJointAttribute(knupf7,#PB_PointJoint_Tau,tau)
    
  EndIf
  
  If hands=3
    ;Debug hands  
    hands=0
    If knupf1
      FreeJoint(knupf1)
      knupf1=0
    EndIf
    If knupf2
      FreeJoint(knupf2)
      knupf2=0
    EndIf
    If knupf3
      FreeJoint(knupf3)
      knupf3=0
    EndIf
    If knupf4
      FreeJoint(knupf4)
      knupf4=0
    EndIf
    If knupf5
      FreeJoint(knupf5)
      knupf5=0
    EndIf
    If knupf6
      FreeJoint(knupf6)
      knupf6=0
    EndIf
    If knupf7
      FreeJoint(knupf7)
      knupf7=0
    EndIf
    
    
  EndIf
  
  If dance=1
    ;dance=2
    ForEach ragdolls()
      If EntityY(ragdolls()\Head)<259.5
        ApplyEntityImpulse(ragdolls()\Head  ,0, 9,0,0,1,0)
        ApplyEntityImpulse(ragdolls()\legru  ,0, -5,0,0,-1,0)
        ApplyEntityImpulse(ragdolls()\leglu  ,0, -5,0,0,-1,0)
        If EntityY(ragdolls()\leglu)<256.8
          ApplyEntityImpulse(ragdolls()\leglu,Random(2)-1,Random(8),Random(2)-1)
        EndIf
        If EntityY(ragdolls()\legru)<256.8
          ApplyEntityImpulse(ragdolls()\legru,Random(2)-1,Random(8),Random(2)-1)
        EndIf
        ApplyEntityImpulse(ragdolls()\armlu,Random(2)-1,Random(2)-1,Random(2)-1)
        ApplyEntityImpulse(ragdolls()\armru,Random(2)-1,Random(2)-1,Random(2)-1)
      EndIf
    Next          
  EndIf
  
  KeyboardMode(#PB_Keyboard_International)
  
  If ExamineKeyboard()
    If KeyboardReleased(#PB_Key_R)  Or KeyboardReleased(#PB_Key_E)
      px.f=0
      py.f=0
      pz.f=0
      ForEach ragdolls()
        px+EntityX(ragdolls()\Body)
        py+EntityY(ragdolls()\Body)
        pz+EntityZ(ragdolls()\Body)
      Next
      px=px/ListSize(ragdolls())
      py=py/ListSize(ragdolls())
      pz=pz/ListSize(ragdolls())
      MoveCamera(camera,0, 260 ,15, #PB_Absolute)
      CameraLookAt(camera,px,py,pz)
    EndIf
    If KeyboardPushed(#PB_Key_P) 
      px.f=0
      py.f=0
      pz.f=0
      ForEach ragdolls()
        px+EntityX(ragdolls()\Body)
        py+EntityY(ragdolls()\Body)
        pz+EntityZ(ragdolls()\Body)
      Next
      px=px/ListSize(ragdolls())
      py=py/ListSize(ragdolls())
      pz=pz/ListSize(ragdolls())
      CameraLookAt(camera,px,py,pz)
    EndIf
    
    If KeyboardPushed(#PB_Key_N)
      bloodygameheight+1
    EndIf
    If KeyboardPushed(#PB_Key_M)
      bloodygameheight-1
      If bloodygameheight<290
        bloodygameheight=290
      EndIf
      
    EndIf
    If KeyboardReleased(#PB_Key_O)
      killjoints()
      hands=0
      makejoints()
      ForEach ragdolls()
        SetEntityMaterial(ragdolls()\eyel, MaterialID(MatEye))
        SetEntityMaterial(ragdolls()\eyer, MaterialID(MatEye))
      Next
      
    EndIf
    If KeyboardReleased(#PB_Key_L)
      killjoints()
      hands=0
      ForEach ragdolls()
        SetEntityMaterial(ragdolls()\eyel, MaterialID(MatDeadEye))
        SetEntityMaterial(ragdolls()\eyer, MaterialID(MatDeadEye))
      Next
    EndIf
    
    If KeyboardReleased(#PB_Key_B)
      px.f=0
      py.f=0
      pz.f=0
      ForEach ragdolls()
        px+EntityX(ragdolls()\Body)
        py+EntityY(ragdolls()\Body)
        pz+EntityZ(ragdolls()\Body)
      Next
      px=px/ListSize(ragdolls())
      py=py/ListSize(ragdolls())
      pz=pz/ListSize(ragdolls())
      ForEach(ragdolls())
        ApplyEntityImpulse(ragdolls()\Body,Random(20)-10,0,Random(20)-10)
        ApplyEntityImpulse(ragdolls()\Head,Random(20)-10,0,Random(20)-10)
      Next
      MoveCamera(camera,px,py+10,pz,#PB_Absolute)
      CameraLookAt(camera,0,260,0)
    EndIf
    If KeyboardPushed(#PB_Key_S) And shoot=0
      ForEach ragdolls()
        ApplyEntityImpulse(ragdolls()\Body,0,0,-100,Random(8)-4,Random(8)-4,Random(8)-4)
        shoot=1
      Next
    EndIf
    
    If KeyboardReleased(#PB_Key_S)
      shoot=0
    EndIf
    
    If KeyboardPushed(#PB_Key_R)
      ForEach ragdolls()
        MoveEntity(ragdolls()\Head,ragdolls()\posx,ragdolls()\posy,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\Body,ragdolls()\posx,ragdolls()\posy-1,ragdolls()\posz,#PB_Absolute)
        RotateEntity(ragdolls()\Body,0,0,0,#PB_Absolute)
        MoveEntity(ragdolls()\legr,ragdolls()\posx+0.3,ragdolls()\posy-2,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\legl,ragdolls()\posx-0.3,ragdolls()\posy-2,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\legru,ragdolls()\posx+0.3,ragdolls()\posy-2.9,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\leglu,ragdolls()\posx-0.3,ragdolls()\posy-2.9,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\armr,ragdolls()\posx+0.6,ragdolls()\posy-1,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\arml,ragdolls()\posx-0.6,ragdolls()\posy-1,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\armru,ragdolls()\posx+0.6,ragdolls()\posy-2,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\armlu,ragdolls()\posx-0.6,ragdolls()\posy-2,ragdolls()\posz,#PB_Absolute)
      Next
    EndIf
    
    If KeyboardPushed(#PB_Key_B)
      ForEach ragdolls()
        MoveEntity(ragdolls()\Head,ragdolls()\posx,bloodygameheight,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\Body,ragdolls()\posx,bloodygameheight-1,ragdolls()\posz,#PB_Absolute)
        RotateEntity(ragdolls()\Body,0,0,0,#PB_Absolute)
        MoveEntity(ragdolls()\legr,ragdolls()\posx+0.3,bloodygameheight-2,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\legl,ragdolls()\posx-0.3,bloodygameheight-2,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\legru,ragdolls()\posx+0.3,bloodygameheight-2.9,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\leglu,ragdolls()\posx-0.3,bloodygameheight-2.9,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\armr,ragdolls()\posx+0.6,bloodygameheight-1,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\arml,ragdolls()\posx-0.6,bloodygameheight-1,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\armru,ragdolls()\posx+0.6,bloodygameheight-2,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\armlu,ragdolls()\posx-0.6,bloodygameheight-2,ragdolls()\posz,#PB_Absolute)
      Next
    EndIf
    
    If KeyboardReleased(#PB_Key_V) 
      Select hands
        Case 0
          hands=1
        Case 2
          hands=3
      EndSelect
    EndIf
    
    
    If KeyboardPushed(#PB_Key_T)
      ForEach ragdolls()
        ApplyEntityImpulse(ragdolls()\armlu ,0,-1,0,0,-1,0)
        ApplyEntityImpulse(ragdolls()\armru ,0,-1,0,0,-1,0)
        ApplyEntityImpulse(ragdolls()\leglu,0,-3,0,0,-1,0)
        ApplyEntityImpulse(ragdolls()\legru,0,-3,0,0,-1,0)
        ApplyEntityImpulse(ragdolls()\Head  ,0, 10,0,0,1,0)
        ;ApplyEntityForce(ragdolls()\HEAD,(Random(10)+5)*-1,0,(Random(10)+5)*-1) ;nearly ParachuteEffect
      Next
    EndIf
    
    If KeyboardPushed(#PB_Key_J)
      ForEach ragdolls()
        ApplyEntityImpulse(ragdolls()\Head,0,10,0)
      Next
    EndIf
    If KeyboardPushed(#PB_Key_K)
      SelectElement(ragdolls(),1)
      ApplyEntityImpulse(ragdolls()\Head,0,Random(10)+9,0)
      
    EndIf
    If KeyboardPushed(#PB_Key_I)
      I_f+0.1
      SelectElement(ragdolls(),0)
      ApplyEntityImpulse(ragdolls()\armlu,0,10+I_f,0)
      
    EndIf
    If KeyboardReleased(#PB_Key_I)
      i_f=0
    EndIf
    
    If KeyboardReleased(#PB_Key_U)
      Select dance
        Case 1
          dance=0
        Case 0
          dance=1
      EndSelect
      
    EndIf
    
    
    If KeyboardPushed(#PB_Key_F)
      ForEach ragdolls()
        If EntityY(ragdolls()\Body)<259
          ApplyEntityImpulse(ragdolls()\Body,0, 3,0,0,-10,0)
          ApplyEntityImpulse(ragdolls()\armlu  ,0, 3,0,0,-10,0)
          ApplyEntityImpulse(ragdolls()\armru  ,0, 3,0,0,-10,0)
          ApplyEntityImpulse(ragdolls()\leglu ,0, 3,0,0,-10,0)
          ApplyEntityImpulse(ragdolls()\legru ,0, 3,0,0,-10,0)
          ApplyEntityImpulse(ragdolls()\Head   ,0,6,0,0,0  ,0)
        EndIf
      Next
    EndIf
    
    If KeyboardPushed(#PB_Key_H)
      ForEach ragdolls()
        ApplyEntityImpulse(ragdolls()\armlu,0,1,0,0,-2,0)
        ApplyEntityImpulse(ragdolls()\armru,0,1,0,0,-2,0)
        ApplyEntityImpulse(ragdolls()\legl,0,-4,0,0,-20,0)
        ApplyEntityImpulse(ragdolls()\legr,0,-4,0,0,-20,0)
        ApplyEntityImpulse(ragdolls()\Head,0,5,0,0,0,0)
        ApplyEntityImpulse(ragdolls()\Body,0,4,0,0,10,0)
      Next
    EndIf
    ;Earthquake
    If KeyboardReleased(#PB_Key_Q)
      If earthquake
        ;Debug "Earthquake off"
        
        earthquake=0
      Else
        ; Debug "Earthquake on"
        earthquake=1
      EndIf
      
    EndIf
    
    ;KeyboardPushed Q
    ; plate rumbles (mimimal impulses in different dierctions)
    ;
    
    If KeyboardPushed(#PB_Key_Add)
      wg+1
      WorldGravity(wg)
    EndIf
    
    If KeyboardPushed(#PB_Key_Subtract)
      wg-1
      WorldGravity(wg)
    EndIf
    
    If KeyboardPushed(#PB_Key_G)
      
      ForEach ragdolls()
        ApplyEntityImpulse(ragdolls()\Head   ,0, 2,0)
        ApplyEntityImpulse(ragdolls()\legl , 0, Random(4),0,0,-6,0)
        ApplyEntityImpulse(ragdolls()\legr , 0, Random(4),0,0,-6,0)
        ApplyEntityImpulse(ragdolls()\armlu , 0, Random(1),0,0,6,0)
        ApplyEntityImpulse(ragdolls()\armru , 0, Random(1),0,0,6,0)
        
        ApplyEntityImpulse(ragdolls()\Body,0,-6,0,0,0,0)
      Next
    EndIf
    
    If KeyboardPushed(#PB_Key_Pad6)
      ForEach ragdolls()
        RotateEntity(ragdolls()\Head,0,10,0,#PB_Relative)
      Next
    EndIf
    If KeyboardPushed(#PB_Key_Pad4)
      ForEach ragdolls()
        RotateEntity(ragdolls()\Head,0,-10,0,#PB_Relative)
      Next
    EndIf
    If KeyboardPushed(#PB_Key_Pad1)
      ForEach ragdolls()
        RotateEntity(ragdolls()\Head,0,0,-5,#PB_Relative)
      Next
    EndIf
    If KeyboardPushed(#PB_Key_Pad3)
      ForEach ragdolls()
        RotateEntity(ragdolls()\Head,0,0,5,#PB_Relative)
      Next
    EndIf
    If KeyboardPushed(#PB_Key_Pad8)
      ForEach ragdolls()
        RotateEntity(ragdolls()\Head,-10,0,0,#PB_Relative)
      Next
    EndIf
    If KeyboardPushed(#PB_Key_Pad2)
      ForEach ragdolls()
        RotateEntity(ragdolls()\Head,10,0,0,#PB_Relative)
      Next
    EndIf
    
    If KeyboardPushed(#PB_Key_Left)
      KeyX = -#CameraSpeed
    ElseIf KeyboardPushed(#PB_Key_Right)
      KeyX = #CameraSpeed
    Else
      KeyX = 0
    EndIf
    
    If KeyboardPushed(#PB_Key_Up)
      KeyY = -#CameraSpeed
    ElseIf KeyboardPushed(#PB_Key_Down)
      KeyY = #CameraSpeed
    Else
      KeyY = 0
    EndIf
  EndIf
  If earthquake
    ;Debug EntityY(platte)
    rx.f=(Random(200)-99)/1000
    ry.f=(Random(200)-99)/1000
    rz.f=(Random(200)-99)/1000
    MoveEntity(platte, rx,ry+256,rz, #PB_Absolute)
    ApplyEntityForce(platte,0,0,50)
    
    ;Debug ApplyEntityImpulse(platte  ,0,0,0,0,100,0,#PB_World)
  Else
    ;MoveEntity(platte,0,256,0,#PB_Absolute)
  EndIf
  
  RotateCamera(camera, MouseY, MouseX, 0, #PB_Relative)
  MoveCamera  (camera, KeyX, 0, KeyY)
  
  ;Make it Bloody
  ExamineWorldCollisions(#True)
  While NextWorldCollision()
    
    If platte=FirstWorldCollisionEntity() Or platte=SecondWorldCollisionEntity()
      wcap=WorldCollisionAppliedImpulse()
      ;Debug GetY()
      
      impy=wcap;GetY()
      
      If impy>666
        killjoints()
        hands=0
      EndIf
      If impy>100
        dead=1
        ForEach ragdolls()
          SetEntityMaterial(ragdolls()\eyel, MaterialID(MatDeadEye))
          SetEntityMaterial(ragdolls()\eyer, MaterialID(MatDeadEye))
        Next
      EndIf
      
      If impy>20 ; blood with heavier impulses
        If impy>100
          impy=100
        EndIf
        
        WorldCollisionContact()
        AddElement(blood())
        blood()\id=CopyEntity(kontakt,#PB_Any)
        ScaleEntity(blood()\id,impy/5,1,impy/5,#PB_Relative)
        
        blood()\time=ElapsedMilliseconds()+(impy*impy/2)
        MoveEntity(blood()\id,GetX(),GetY(),GetZ(),#PB_Absolute)
        
      EndIf
      
    EndIf
    
  Wend
  ForEach blood()
    If ElapsedMilliseconds()>blood()\time+5000
      FreeEntity(blood()\id)
      DeleteElement(blood())
      If dead
        ForEach ragdolls()
          SetEntityMaterial(ragdolls()\eyel, MaterialID(MatEye))
          SetEntityMaterial(ragdolls()\eyer, MaterialID(MatEye))
          
        Next
        dead=0
      EndIf
      
    EndIf
  Next
  
  RenderWorld()
  FlipBuffers()
  
  While WindowEvent():Wend   
  
  ;steuerung
  MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
  MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
  
  KeyX = (KeyboardPushed(#PB_Key_Right)-KeyboardPushed(#PB_Key_Left))*#CameraSpeed
  Keyy = (KeyboardPushed(#PB_Key_Down)-KeyboardPushed(#PB_Key_Up))*#CameraSpeed
  
  RotateCamera(camera, MouseY, MouseX, 0, #PB_Relative)
  MoveCamera  (camera, KeyX, 0, KeyY)
  
  
  RenderWorld()
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1

End

Re: RagDoll Ogre PhysikEngine

Verfasst: 24.07.2025 11:14
von Lord
bobobo hat geschrieben: 23.07.2025 14:07 version die auch mit pb 6.41 rennt
...
Wann wird diese PB-Version denn offiziell veröffentlicht?
Ist das schon eine Beta die Du nutzt?
Bist Du Tester für Alpha-Versionen?

>:) >:) >:)

Re: RagDoll Ogre PhysikEngine

Verfasst: 30.07.2025 17:44
von bobobo
update. sich widerholebnde jobs vereinfacht und etwas mehr ionfo über benutzte shortcuts
UND JA .. ICH HAB MICH VERSCHRIEBEN 6.21 ist und war gemeint :)

Code: Alles auswählen

;
; ------------------------------------------------------------
;
;   PureBasic - RagDoll fuer Purebasic ab 6.20
;
;    (c) 2002 - Fantaisie Software , bobobo
; 
; das Programm sollte im Verzeichnis  \Examples\3D liegen
; weil ich das so will :)
; alles ohne Gewähr
; ------------------------------------------------------------
;

#CameraSpeed = 1



Define.f KeyX, KeyY, MouseX, MouseY ,rott, moveit, I_f
Define.i Knupf1,knupf2, Knupf3 , hands 


Structure components
  nodeid.i:ball.i:limb.i:texture.i:Bodymesh.i:Body.i:HeadMesh.i:Head.i
  Nose.i:eyer.i:eyel.i:mouth.i:earl.i:earr.i:arml.i:armlu.i:armr.i:armru.i
  legl.i:leglu.i:legr.i:legru.i:footl.i:footr.i:ct_bodyhead.i:ct_arml.i
  hinge_arml.i:ct_armr.i:hinge_armr.i:hinge_legl.i:hinge_leglu.i:hinge_legr.i
  hinge_legru.i:posx.i:posy.i:posz.i:knupf.i
EndStructure

Define ragdoll.components
Global NewList ragdolls.components()

Structure blood
  id.i
  time.i
EndStructure

bloodygameheight=340
NewList blood.blood()

Procedure killjoints()
  
  ForEach ragdolls()
    FreeJoint(#PB_All)
  Next
  
EndProcedure

Procedure makejoints()
  ;joints
  ForEach ragdolls()
    RotateEntity(ragdolls()\Head,0,0,0,#PB_Absolute)
    RotateEntity(ragdolls()\body,0,0,0,#PB_Absolute)
    RotateEntity(ragdolls()\arml,0,0,0,#PB_Absolute)
    RotateEntity(ragdolls()\armlu,0,0,0,#PB_Absolute)
    RotateEntity(ragdolls()\armr,0,0,0,#PB_Absolute)
    RotateEntity(ragdolls()\armru,0,0,0,#PB_Absolute)
    RotateEntity(ragdolls()\legl,0,0,0,#PB_Absolute)
    RotateEntity(ragdolls()\leglu,0,0,0,#PB_Absolute)
    RotateEntity(ragdolls()\legr,0,0,0,#PB_Absolute)
    RotateEntity(ragdolls()\legru,0,0,0,#PB_Absolute)
    
    ragdolls()\ct_bodyhead=ConeTwistJoint(#PB_Any,EntityID(ragdolls()\Body)  , 0, 0.7,0,EntityID(ragdolls()\Head) ,0,-0.4,0)
    ;ragdolls()\ct_bodyhead=PointJoint(#PB_Any,EntityID(ragdolls()\Body)  , 0, 0.7,0,EntityID(ragdolls()\Head) ,0,-0.4,0)
    
    ragdolls()\ct_arml     = ConeTwistJoint(#PB_Any,EntityID(ragdolls()\Body),-0.6,  0.5 ,0,EntityID(ragdolls()\arml)       , 0, 0.4,0)
    ragdolls()\hinge_arml  = HingeJoint(#PB_Any,EntityID(ragdolls()\arml)    ,   0, -0.45,0,1,0,0,EntityID(ragdolls()\armlu), 0,0.45,0,1,0,0)
    
    ragdolls()\ct_armr     = ConeTwistJoint(#PB_Any,EntityID(ragdolls()\Body), 0.6, 0.5,0,EntityID(ragdolls()\armr),        0, 0.4,0)
    ragdolls()\hinge_armr  = HingeJoint(#PB_Any,EntityID(ragdolls()\armr)    , 0  ,-0.45,0,1,0,0,EntityID(ragdolls()\armru), 0,0.45,0,1,0,0)
    
    ragdolls()\hinge_legl  = HingeJoint(#PB_Any,EntityID(ragdolls()\Body)    ,-0.3,-0.60,0,1,0,0,EntityID(ragdolls()\legl) , 0,0.40,0,1,0,0)
    ragdolls()\hinge_legr  = HingeJoint(#PB_Any,EntityID(ragdolls()\Body)    , 0.3,-0.60,0,1,0,0,EntityID(ragdolls()\legr) , 0,0.40,0,1,0,0)
    ragdolls()\hinge_leglu = HingeJoint(#PB_Any,EntityID(ragdolls()\legl)    ,   0,-0.45,0,1,0,0,EntityID(ragdolls()\leglu), 0,0.45,0,1,0,0)
    ragdolls()\hinge_legru = HingeJoint(#PB_Any,EntityID(ragdolls()\legr)    ,   0,-0.45,0,1,0,0,EntityID(ragdolls()\legru), 0,0.45,0,1,0,0)
    
    ;joints attributes       
    SetJointAttribute(ragdolls()\ct_bodyhead,#PB_ConeTwistJoint_SwingSpan,0.5)
    SetJointAttribute(ragdolls()\ct_bodyhead,#PB_ConeTwistJoint_SwingSpan2,0.5)
    SetJointAttribute(ragdolls()\ct_bodyhead,#PB_ConeTwistJoint_TwistSpan,0.5)
    ;       ;          
    SetJointAttribute(ragdolls()\ct_arml,#PB_ConeTwistJoint_SwingSpan ,0.2);seitl
    SetJointAttribute(ragdolls()\ct_arml,#PB_ConeTwistJoint_SwingSpan2,1)  ;dreh
    SetJointAttribute(ragdolls()\ct_arml,#PB_ConeTwistJoint_TwistSpan ,2)  ;vorzurück
                                                                           ;       ;          
    SetJointAttribute(ragdolls()\hinge_arml,#PB_HingeJoint_LowerLimit,0)
    SetJointAttribute(ragdolls()\hinge_arml,#PB_HingeJoint_UpperLimit,120)
    SetJointAttribute(ragdolls()\hinge_armr,#PB_HingeJoint_LowerLimit,0)
    SetJointAttribute(ragdolls()\hinge_armr,#PB_HingeJoint_UpperLimit,120)
    
    SetJointAttribute(ragdolls()\ct_armr,#PB_ConeTwistJoint_SwingSpan,0.2);seitlich
    SetJointAttribute(ragdolls()\ct_armr,#PB_ConeTwistJoint_SwingSpan2,1) ;dreh
    SetJointAttribute(ragdolls()\ct_armr,#PB_ConeTwistJoint_TwistSpan,2)  ;vorzurück
    
    SetJointAttribute(ragdolls()\hinge_legl,#PB_HingeJoint_LowerLimit,-1)
    SetJointAttribute(ragdolls()\hinge_legl,#PB_HingeJoint_UpperLimit,120)
    SetJointAttribute(ragdolls()\hinge_legr,#PB_HingeJoint_LowerLimit,-1)
    SetJointAttribute(ragdolls()\hinge_legr,#PB_HingeJoint_UpperLimit,120)
    
    SetJointAttribute(ragdolls()\hinge_leglu,#PB_HingeJoint_LowerLimit,-120)
    SetJointAttribute(ragdolls()\hinge_leglu,#PB_HingeJoint_UpperLimit,1)
    SetJointAttribute(ragdolls()\hinge_legru,#PB_HingeJoint_LowerLimit,-120)
    SetJointAttribute(ragdolls()\hinge_legru,#PB_HingeJoint_UpperLimit,1)
  Next
EndProcedure

InitEngine3D()

InitSprite()
InitKeyboard()
InitMouse()

ExamineDesktops():dx=DesktopWidth(0)*0.8:dy=DesktopHeight(0)*0.8
OpenWindow(0, 0,0, DesktopUnscaledX(dx),DesktopUnscaledY(dy), "Camera - [Esc] quit",#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0), 0, 0, dx, dy, 0, 0, 0)

Add3DArchive(#PB_Compiler_Home + "/Examples/3D/" +"Data/Textures", #PB_3DArchive_FileSystem)

Add3DArchive(#PB_Compiler_Home + "/Examples/3D/" +"Data/Packs/desert.zip", #PB_3DArchive_Zip)
Parse3DScripts()

InitSprite()
InitKeyboard()
InitMouse()


;WorldShadows(#PB_Shadow_Additive,512)
SkyBox("desert07.jpg")
camera=CreateCamera(#PB_Any,0,0,100,100)
;CameraRenderMode(camera, #PB_Camera_Plot)
MoveCamera(camera,0, 260 ,15, #PB_Absolute)

texture1t=CreateTexture(#PB_Any,512,512)
font=LoadFont(#PB_Any,"",14,#PB_Font_HighQuality)
fontsmall=LoadFont(#PB_Any,"",6,#PB_Font_Bold)
StartDrawing(TextureOutput(texture1t))
DrawingFont(FontID(font))
Box(0, 0, 512, 512, RGBA(222,222,255, 200))
For l=0 To 128 
  Circle(Random(512),Random(512),Random(4)+1,RGBA(128,128,255,255))
Next l
DrawingMode(#PB_2DDrawing_Transparent)

FrontColor(#Black)
;BackColor(#Black)
th=TextHeight("X")
ty=0
DrawText(0, 0,"V:Hands OFF/ON (**)")
ty+th
DrawText(0,ty,"U:IdiotDance OFF/ON (**)")
ty+th
DrawText(0,ty,"R:reset (*)")
ty+th
DrawText(0,ty,"B:BloodyGame (**)")
ty+th
DrawText(0,ty,"BloodyGameHeight N:increase , M: decrease (*)")
ty+th
DrawText(0,ty,"T:upright (*)")
ty+th
DrawText(0,ty,"H:hail (*), G:strange (*)")
ty+th
DrawText(0,ty,"T: upright (*)")
ty+th
DrawText(0,ty,"F:forceup (near plate) (trampoline) (*)")
ty+th
DrawText(0,ty,"J:forceup (*)")
ty+th
DrawText(0,ty,"P:LookatAll (*)")
ty+th
DrawText(0,ty,"S:Shoot (**)")
ty+th
DrawText(0,ty,"L:Disassemble , O: Assemble (**)")
ty+th
DrawText(0,ty,"1,2,3,4,6,8 turns head (*)")
ty+th
DrawText(0,ty,"Add:Gravitiy decrease")
ty+th
DrawText(0,ty,"Sub:Gravitiy increase")
ty+th
DrawText(0,ty,"Q:Quakemode, Hello Newzealand")
ty+th
DrawText(0,ty,"(*) while pressed,  (**) when release key")
;Debug ty
DrawingFont(FontID(fontsmall))
ttx=512-140
tt=20
tth=TextHeight("X")
FrontColor(#Black)
DrawText(ttx,tt,"used shortcuts (press or release)"):tt+tth
DrawText(ttx,tt,"#PB_Key_Add        "):tt+tth
DrawText(ttx,tt,"#PB_Key_B        "):tt+tth
DrawText(ttx,tt,"#PB_Key_Down        "):tt+tth
DrawText(ttx,tt,"#PB_Key_E        "):tt+tth
DrawText(ttx,tt,"#PB_Key_Escape        "):tt+tth
DrawText(ttx,tt,"#PB_Key_F        "):tt+tth
DrawText(ttx,tt,"#PB_Key_G        "):tt+tth
DrawText(ttx,tt,"#PB_Key_H        "):tt+tth
DrawText(ttx,tt,"#PB_Key_I        "):tt+tth
DrawText(ttx,tt,"#PB_Key_J        "):tt+tth
DrawText(ttx,tt,"#PB_Key_K        "):tt+tth
DrawText(ttx,tt,"#PB_Key_L        "):tt+tth
DrawText(ttx,tt,"#PB_Key_Left        "):tt+tth
DrawText(ttx,tt,"#PB_Key_M        "):tt+tth
DrawText(ttx,tt,"#PB_Key_N        "):tt+tth
DrawText(ttx,tt,"#PB_Key_O        "):tt+tth
DrawText(ttx,tt,"#PB_Key_P        "):tt+tth
DrawText(ttx,tt,"#PB_Key_Pad1        "):tt+tth
DrawText(ttx,tt,"#PB_Key_Pad2        "):tt+tth
DrawText(ttx,tt,"#PB_Key_Pad3        "):tt+tth
DrawText(ttx,tt,"#PB_Key_Pad4        "):tt+tth
DrawText(ttx,tt,"#PB_Key_Pad6        "):tt+tth
DrawText(ttx,tt,"#PB_Key_Pad8        "):tt+tth
DrawText(ttx,tt,"#PB_Key_Q        "):tt+tth
DrawText(ttx,tt,"#PB_Key_R        "):tt+tth
DrawText(ttx,tt,"#PB_Key_Right        "):tt+tth
DrawText(ttx,tt,"#PB_Key_S        "):tt+tth
DrawText(ttx,tt,"#PB_Key_Subtract        "):tt+tth
DrawText(ttx,tt,"#PB_Key_T        "):tt+tth
DrawText(ttx,tt,"#PB_Key_U        "):tt+tth
DrawText(ttx,tt,"#PB_Key_Up        "):tt+tth
DrawText(ttx,tt,"#PB_Key_V         "):tt+tth

StopDrawing()

texture1=CreateMaterial(#PB_Any, TextureID(texture1t))

texture2=CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(texture2))
DrawingMode(#PB_2DDrawing_AlphaBlend)
Box(0,0,256,256,RGBA(0,0,0,0))

DrawingFont(FontID(font))

;FrontColor(RGBA(0,0,0,255))
DrawText(0,0,"Press B and have fun",RGBA(255,255,0,255),RGBA(0,0,0,0))
DrawText(0,15,"and get a more complete list",RGBA(255,255,0,255),RGBA(0,0,0,0))
DrawText(0,30,"of used shortcuts",RGBA(255,255,0,255),RGBA(0,0,0,0))

DrawText(0,50,"Hold N for a time and press B",RGBA(255,255,0,255),RGBA(0,0,0,0))
DrawText(0,70,"and have even more fun",RGBA(255,255,0,255),RGBA(0,0,0,0))
LineXY(0,0,52,5,RGBA(255,255,0,255))
LineXY(45,2,52,5,RGBA(255,255,0,255))
LineXY(45,6,52,5,RGBA(255,255,0,255))
StopDrawing()
infomat=CreateMaterial(#PB_Any,TextureID(texture2))
MaterialBlendingMode(infomat,#PB_Material_AlphaBlend)

texture2= CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(texture2))
Box(0,0,256,256,RGBA(80,80,80,180))

For l=0 To 400
  Circle(Random(256),Random(256),Random(3)+1,RGBA(Random(5)+100,Random(5)+100,Random(5)+100,180))
Next l

DrawText(0,0,"ragdoll ®",RGBA(255,0,0,255),RGBA(80,80,80,222))
StopDrawing()

texture2=CreateMaterial(#PB_Any, TextureID(texture2))

textureblue = CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(textureblue))
Box(0,0,256,256,#White)
Ellipse(  0,128,25,50,RGB(30, 144, 255))
Ellipse(256,128,25,50,RGB(30, 144, 255))
Ellipse(  0,128,10,20,RGB(0 ,   0,   0))
Ellipse(256,128,10,20,RGB(0 ,   0,   0))
StopDrawing()
MatEye = CreateMaterial(#PB_Any,TextureID(textureblue))

texturedead = CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(texturedead))
Box(0,0,256,256,#White)
For de=0 To 10
  Line(0,128+de,256,1,#Black)
  Line(0,128-de,256,1,#Black)
Next

For de=0 To 10
  Line(de,0,1,256,#Black)
  Line(256-de,0,1,256,#Black)
  
Next

StopDrawing()
MatDeadEye = CreateMaterial(#PB_Any,TextureID(texturedead))

textureflesh = CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(textureflesh))
Box(0,0,256,256,RGB(255, 218, 185))
For f=0 To 512
  Circle(Random(255),Random(255),Random(2),RGB(243, 208, 161))
Next

StopDrawing()
MatFlesh = CreateMaterial(#PB_Any,TextureID(textureflesh))

texturemouth = CreateTexture(#PB_Any,256,256)
StartDrawing(TextureOutput(texturemouth))
Box(0,0,256,256,#White)
For t=0 To 256 Step 16
  Line(t,0,1,256,#Black)
  Line(t-1,0,1,256,#Black)
  Line(t-2,0,1,256,#Black)
  Line(t+1,0,1,256,#Black)
  Line(t+2,0,1,256,#Black)
Next t

StopDrawing()
MatMouth = CreateMaterial(#PB_Any,TextureID(texturemouth))

texturekontakt= CreateTexture(#PB_Any,256,256)

StartDrawing(TextureOutput(texturekontakt))
DrawingMode(#PB_2DDrawing_AlphaBlend)
Box(0,0,256,256,RGBA(0,0,0,0))
For c=1 To 32
  bx=64+Random(128)
  by=64+Random(128)
  br=Random(32)
  Circle(bx,by,br,RGBA(255,0,0,br*4))
Next c

StopDrawing()

MatKontakt = CreateMaterial(#PB_Any,TextureID(texturekontakt))

MaterialBlendingMode(MatKontakt,#PB_Material_AlphaBlend)
RotateMaterial(MatKontakt,0.005,#PB_Material_Animated)
AddMaterialLayer(MatKontakt,TextureID(texturekontakt),#PB_Material_Add)

Bodymesh = CreateCube(#PB_Any,1)
LimbMesh = CreateCylinder(#PB_Any, 0.1 ,0.80)

HeadMesh  = CreateSphere(#PB_Any , 0.5); ,12,12)
NoseMesh  = CreateSphere(#PB_Any , 0.25, 3, 4)
EyeMeshl  = CreateSphere(#PB_Any , 0.10);,8,8)
EyeMeshr  = CreateSphere(#PB_Any , 0.10);,8,8)
MouthMesh = CreateSphere(#PB_Any , 0.25,15,15)
EarMeshl =  CreateSphere(#PB_Any , 0.25);,8,8)
EarMeshr =  CreateSphere(#PB_Any , 0.25);,8,8)
FootMeshl = CreateSphere(#PB_Any , 0.25,6,6)
FootMeshr = CreateSphere(#PB_Any , 0.25,6,6)

kontaktMesh= CreatePlane(#PB_Any,0.25,0.25,1,1,1,1)
TransformMesh(kontaktMesh,0,0.05,0,1,1,1,0,0,0)
kontakt=CreateEntity(#PB_Any,MeshID(kontaktMesh),MaterialID(MatKontakt))
EntityRenderMode(kontakt, #PB_Entity_CastShadow)


TransformMesh(NoseMesh , 0.00, 0.00, 0.50, 1.00, 1.00, 1.00,  0.00,  0.00, 0.00)
TransformMesh(EyeMeshl ,-0.35, 0.20, 0.25, 1.00, 1.00, 1.00,  0.00,  0.00, 0.00)
TransformMesh(EyeMeshr , 0.35, 0.20, 0.25, 1.00, 1.00, 1.00,  0.00,  0.00, 0.00)
TransformMesh(MouthMesh, 0.00,-0.15, 0.22, 1.50, 0.45, 1.00, 40.00,  0.00,  0.00)
TransformMesh(EarMeshl ,-0.50,-0.10,-0.20, 1.00, 1.00, 0.25,  0.00,  0.00,  0.00)
TransformMesh(EarMeshr , 0.50,-0.10,-0.20, 1.00, 1.00, 0.25,  0.00,  0.00,  0.00)
TransformMesh(FootMeshl,-0.02,-0.38, 0.15, 0.50, 0.25, 1.00, 10.00, 20.00,  0.00)
TransformMesh(FootMeshr, 0.02,-0.38, 0.15, 0.50, 0.25, 1.00, 10.00,-20.00,  0.00)
bzz=24 ;amount ragdolls
For r=1 To bzz 
  
  AddElement(ragdolls())
  
  ragdolls()\posx=r*2-bzz
  ragdolls()\posy=259 ;height
  ragdolls()\posz=0
  
  ragdolls()\texture=texture2
  
  ;bodyparts
  
  ragdolls()\Body=CreateEntity(#PB_Any,MeshID(Bodymesh),MaterialID(ragdolls()\texture),ragdolls()\posx,ragdolls()\posy,ragdolls()\posz)
  ScaleEntity(ragdolls()\Body,1.0,1,0.25)
  
  ragdolls()\Nose  = CreateEntity(#PB_Any,MeshID(NoseMesh) ,MaterialID(MatFlesh))
  ragdolls()\eyel  = CreateEntity(#PB_Any,MeshID(EyeMeshl) ,MaterialID(MatEye))
  ragdolls()\eyer  = CreateEntity(#PB_Any,MeshID(EyeMeshr) ,MaterialID(MatEye))
  ragdolls()\mouth = CreateEntity(#PB_Any,MeshID(MouthMesh),MaterialID(MatMouth))
  ragdolls()\earl  = CreateEntity(#PB_Any,MeshID(EarMeshl) ,MaterialID(MatFlesh))
  ragdolls()\earr  = CreateEntity(#PB_Any,MeshID(EarMeshr) ,MaterialID(MatFlesh))
  
  ragdolls()\Head = CreateEntity(#PB_Any,MeshID(HeadMesh),MaterialID(MatFlesh),  ragdolls()\posx,ragdolls()\posy+1,ragdolls()\posz)
  AttachEntityObject(ragdolls()\Head,"",EntityID(ragdolls()\Nose) ,0,0,0,0,0,0)
  AttachEntityObject(ragdolls()\Head,"",EntityID(ragdolls()\eyel) ,0,0,0,0,0,0)
  AttachEntityObject(ragdolls()\Head,"",EntityID(ragdolls()\eyer) ,0,0,0,0,0,0)
  AttachEntityObject(ragdolls()\Head,"",EntityID(ragdolls()\mouth),0,0,0,0,0,0)
  AttachEntityObject(ragdolls()\Head,"",EntityID(ragdolls()\earl) ,0,0,0,0,0,0)
  AttachEntityObject(ragdolls()\Head,"",EntityID(ragdolls()\earr) ,0,0,0,0,0,0)
  
  ragdolls()\arml  = CreateEntity(#PB_Any,MeshID(LimbMesh),MaterialID(ragdolls()\texture) ,ragdolls()\posx-0.6,ragdolls()\posy,ragdolls()\posz)
  ragdolls()\armlu = CreateEntity(#PB_Any,MeshID(LimbMesh),MaterialID(ragdolls()\texture) ,ragdolls()\posx-0.6,ragdolls()\posy-1,ragdolls()\posz)
  ragdolls()\armr  = CreateEntity(#PB_Any,MeshID(LimbMesh),MaterialID(ragdolls()\texture) ,ragdolls()\posx+0.6,ragdolls()\posy,ragdolls()\posz)
  ragdolls()\armru = CreateEntity(#PB_Any,MeshID(LimbMesh),MaterialID(ragdolls()\texture) ,ragdolls()\posx+ 0.6,ragdolls()\posy-1,ragdolls()\posz)
  
  ragdolls()\legl = CreateEntity(#PB_Any,MeshID(LimbMesh),MaterialID(ragdolls()\texture)  ,ragdolls()\posx-0.3,ragdolls()\posy-1,ragdolls()\posz)
  ragdolls()\legr = CreateEntity(#PB_Any,MeshID(LimbMesh),MaterialID(ragdolls()\texture)  ,ragdolls()\posx+ 0.3,ragdolls()\posy-1,ragdolls()\posz)
  
  ragdolls()\leglu = CreateEntity(#PB_Any,MeshID(LimbMesh),MaterialID(ragdolls()\texture) ,ragdolls()\posx-0.3,ragdolls()\posy-2,ragdolls()\posz)
  ragdolls()\legru = CreateEntity(#PB_Any,MeshID(LimbMesh),MaterialID(ragdolls()\texture) ,ragdolls()\posx+ 0.3,ragdolls()\posy-2,ragdolls()\posz)
  ragdolls()\footl = CreateEntity(#PB_Any,MeshID(FootMeshl),MaterialID(ragdolls()\texture))
  
  AttachEntityObject(ragdolls()\leglu,"",EntityID(ragdolls()\footl) ,0,0,0,0,0,0)
  ragdolls()\footr = CreateEntity(#PB_Any,MeshID(FootMeshr),MaterialID(ragdolls()\texture))
  
  AttachEntityObject(ragdolls()\legru,"",EntityID(ragdolls()\footr) ,0,0,0,0,0,0)
  
  ;rendermode=#PB_Entity_CastShadow
  ;rendermode=#PB_Entity_CastShadow|#PB_Entity_DisplaySkeleton
  
  ;bodyPhysics
  CreateEntityBody(ragdolls()\Body,#PB_Entity_BoxBody  ,10, 0,1)
  EntityRenderMode(ragdolls()\Body, #PB_Entity_CastShadow)
  
  EntityRenderMode(ragdolls()\Head, #PB_Entity_CastShadow)
  CreateEntityBody(ragdolls()\Head, #PB_Entity_ConvexHullBody, 5, 0.25, 1)
  
  EntityRenderMode(ragdolls()\arml, #PB_Entity_CastShadow) 
  CreateEntityBody(ragdolls()\arml, #PB_Entity_CylinderBody,  1, 0 ,1)
  EntityRenderMode(ragdolls()\armlu, #PB_Entity_CastShadow) 
  CreateEntityBody(ragdolls()\armlu, #PB_Entity_CylinderBody, 1, 0, 1)
  
  EntityRenderMode(ragdolls()\armr, #PB_Entity_CastShadow) 
  CreateEntityBody(ragdolls()\armr, #PB_Entity_CylinderBody,  1, 0, 1)
  EntityRenderMode(ragdolls()\armru, #PB_Entity_CastShadow) 
  CreateEntityBody(ragdolls()\armru, #PB_Entity_CylinderBody, 1, 0,1)
  
  EntityRenderMode(ragdolls()\legl, #PB_Entity_CastShadow) 
  CreateEntityBody(ragdolls()\legl, #PB_Entity_CylinderBody, 1, 0,1)
  EntityRenderMode(ragdolls()\leglu, #PB_Entity_CastShadow) 
  CreateEntityBody(ragdolls()\leglu, #PB_Entity_CylinderBody,1, 0,1)
  
  EntityRenderMode(ragdolls()\legr, #PB_Entity_CastShadow) 
  CreateEntityBody(ragdolls()\legr, #PB_Entity_CylinderBody, 1, 0,1)
  EntityRenderMode(ragdolls()\legru, #PB_Entity_CastShadow) 
  CreateEntityBody(ragdolls()\legru, #PB_Entity_CylinderBody,1, 0,1)
Next 

makejoints()  
;
plate=CreateCube(#PB_Any,1)
ScaleMaterial(texture1,1,1)
RotateMaterial(texture1,90,#PB_Material_Fixed)
;boxes
;For r=1 To 600
;  b=CreateEntity(#PB_Any,MeshID(plate),MaterialID(texture1),Random(20)-10,270,Random(20)-10);,Random(1),Random(10)+274,Random(1))
;  ScaleEntity(b,0.1,3,0.1)
;  CreateEntityBody(b,#PB_Entity_BoxBody   ,05,0.01,100)
;Next r

platte=CreateEntity(#PB_Any,MeshID(plate),MaterialID(texture1),0,0,0)

;ScaleEntity(platte,70,0.01,70)
ScaleEntity(platte,70,0.5,70)
MoveEntity(platte,0,256,0) ; 256 plate height 
EntityRenderMode(platte, #PB_Entity_CastShadow)
CreateEntityBody(platte,#PB_Entity_StaticBody,1,1,0.5)

info=CreateEntity(#PB_Any,MeshID(plate),MaterialID(infomat),0,0,0)
ScaleEntity(info,10,0.01,10)
MoveEntity(info,5,260,0)
RotateEntity(info,90,0,0)
EntityRenderMode(info,  #PB_Entity_DisplaySkeleton )

suncolor=#White

sun=CreateLight(#PB_Any,suncolor,17830,12860,10930,#PB_Light_Point)

CameraLookAt(camera,EntityX(ragdolls()\Head),EntityY(ragdolls()\Head),EntityZ(ragdolls()\Head))
dance=1
hands=1

Repeat
  ;Debug hands
  
  ;Debug "************"
  
  ;Screen3DEvents()
  If ExamineMouse()
    MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
    MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
  EndIf
  
  If hands=1
    hands=2
    ;Debug hands  
    ;Händchenhalten 
    
    size=ListSize(ragdolls())
    sp=-0.5
    tau.f=0
    damp.f=0.5
    For rrr=0 To size-2
    SelectElement(ragdolls(),rrr)
    jx=EntityX(ragdolls()\armru)
    
    jy=EntityY(ragdolls()\armru)
    jz=EntityZ(ragdolls()\armru)
    id=EntityID(ragdolls()\armru)
    SelectElement(ragdolls(),rrr+1)
    jx1=EntityX(ragdolls()\armlu)
    jy1=EntityY(ragdolls()\armlu)
    jz1=EntityZ(ragdolls()\armlu)
    id1=EntityID(ragdolls()\armlu)
    SelectElement(ragdolls(),rrr)
    ragdolls()\knupf =PointJoint(#PB_Any,id,0,sp,0,id1,0,sp,0)
    SetJointAttribute(ragdolls()\knupf,#PB_PointJoint_Damping,damp)
    SetJointAttribute(ragdolls()\knupf,#PB_PointJoint_Tau,tau)
    Next rrr
    
  EndIf
  
  If hands=3
    ;Debug hands  
    hands=0
    
    For rrr=0 To ListSize(ragdolls())-2
      SelectElement(ragdolls(),rrr)
      FreeJoint(ragdolls()\knupf)
    Next rrr
  
      
  
    
  EndIf
  
  If dance=1
    ;dance=2
    ForEach ragdolls()
      If EntityY(ragdolls()\Head)<259.5
        ApplyEntityImpulse(ragdolls()\Head  ,0, 9,0,0,1,0)
        ApplyEntityImpulse(ragdolls()\legru  ,0, -5,0,0,-1,0)
        ApplyEntityImpulse(ragdolls()\leglu  ,0, -5,0,0,-1,0)
        If EntityY(ragdolls()\leglu)<256.8
          ApplyEntityImpulse(ragdolls()\leglu,Random(2)-1,Random(8),Random(2)-1)
        EndIf
        If EntityY(ragdolls()\legru)<256.8
          ApplyEntityImpulse(ragdolls()\legru,Random(2)-1,Random(8),Random(2)-1)
        EndIf
        ApplyEntityImpulse(ragdolls()\armlu,Random(2)-1,Random(2)-1,Random(2)-1)
        ApplyEntityImpulse(ragdolls()\armru,Random(2)-1,Random(2)-1,Random(2)-1)
      EndIf
    Next          
  EndIf
  
  KeyboardMode(#PB_Keyboard_International)
  
  If ExamineKeyboard()
    If KeyboardReleased(#PB_Key_R)  Or KeyboardReleased(#PB_Key_E)
      px.f=0
      py.f=0
      pz.f=0
      ForEach ragdolls()
        px+EntityX(ragdolls()\Body)
        py+EntityY(ragdolls()\Body)
        pz+EntityZ(ragdolls()\Body)
      Next
      px=px/ListSize(ragdolls())
      py=py/ListSize(ragdolls())
      pz=pz/ListSize(ragdolls())
      MoveCamera(camera,0, 260 ,15, #PB_Absolute)
      CameraLookAt(camera,px,py,pz)
    EndIf
    If KeyboardPushed(#PB_Key_P) 
      px.f=0
      py.f=0
      pz.f=0
      ForEach ragdolls()
        px+EntityX(ragdolls()\Body)
        py+EntityY(ragdolls()\Body)
        pz+EntityZ(ragdolls()\Body)
      Next
      px=px/ListSize(ragdolls())
      py=py/ListSize(ragdolls())
      pz=pz/ListSize(ragdolls())
      CameraLookAt(camera,px,py,pz)
    EndIf
    
    If KeyboardPushed(#PB_Key_N)
      bloodygameheight+1
    EndIf
    If KeyboardPushed(#PB_Key_M)
      bloodygameheight-1
      If bloodygameheight<290
        bloodygameheight=290
      EndIf
      
    EndIf
    If KeyboardReleased(#PB_Key_O)
      killjoints()
      hands=0
      makejoints()
      ForEach ragdolls()
        SetEntityMaterial(ragdolls()\eyel, MaterialID(MatEye))
        SetEntityMaterial(ragdolls()\eyer, MaterialID(MatEye))
      Next
      
    EndIf
    If KeyboardReleased(#PB_Key_L)
      killjoints()
      hands=0
      ForEach ragdolls()
        SetEntityMaterial(ragdolls()\eyel, MaterialID(MatDeadEye))
        SetEntityMaterial(ragdolls()\eyer, MaterialID(MatDeadEye))
      Next
    EndIf
    
    If KeyboardReleased(#PB_Key_B)
      px.f=0
      py.f=0
      pz.f=0
      ForEach ragdolls()
        px+EntityX(ragdolls()\Body)
        py+EntityY(ragdolls()\Body)
        pz+EntityZ(ragdolls()\Body)
      Next
      px=px/ListSize(ragdolls())
      py=py/ListSize(ragdolls())
      pz=pz/ListSize(ragdolls())
      ForEach(ragdolls())
        ApplyEntityImpulse(ragdolls()\Body,Random(20)-10,0,Random(20)-10)
        ApplyEntityImpulse(ragdolls()\Head,Random(20)-10,0,Random(20)-10)
      Next
      MoveCamera(camera,px,py+10,pz,#PB_Absolute)
      CameraLookAt(camera,0,260,0)
    EndIf
    If KeyboardPushed(#PB_Key_S) And shoot=0
      ForEach ragdolls()
        ApplyEntityImpulse(ragdolls()\Body,0,0,-100,Random(8)-4,Random(8)-4,Random(8)-4)
        shoot=1
      Next
    EndIf
    
    If KeyboardReleased(#PB_Key_S)
      shoot=0
    EndIf
    
    If KeyboardPushed(#PB_Key_R)
      bzz=1
      ForEach ragdolls()
        MoveEntity(ragdolls()\Head,ragdolls()\posx,ragdolls()\posy+bzz,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\Body,ragdolls()\posx,ragdolls()\posy-1+bzz,ragdolls()\posz,#PB_Absolute)
        RotateEntity(ragdolls()\Body,0,0,0,#PB_Absolute)
        MoveEntity(ragdolls()\legr,ragdolls()\posx+0.3,ragdolls()\posy-2+bzz,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\legl,ragdolls()\posx-0.3,ragdolls()\posy-2+bzz,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\legru,ragdolls()\posx+0.3,ragdolls()\posy-2.9+bzz,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\leglu,ragdolls()\posx-0.3,ragdolls()\posy-2.9+bzz,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\armr,ragdolls()\posx+0.6,ragdolls()\posy-1+bzz,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\arml,ragdolls()\posx-0.6,ragdolls()\posy-1+bzz,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\armru,ragdolls()\posx+0.6,ragdolls()\posy-2+bzz,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\armlu,ragdolls()\posx-0.6,ragdolls()\posy-2+bzz,ragdolls()\posz,#PB_Absolute)
      Next
    EndIf
    
    If KeyboardPushed(#PB_Key_B)
      ForEach ragdolls()
        MoveEntity(ragdolls()\Head,ragdolls()\posx,bloodygameheight,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\Body,ragdolls()\posx,bloodygameheight-1,ragdolls()\posz,#PB_Absolute)
        RotateEntity(ragdolls()\Body,0,0,0,#PB_Absolute)
        MoveEntity(ragdolls()\legr,ragdolls()\posx+0.3,bloodygameheight-2,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\legl,ragdolls()\posx-0.3,bloodygameheight-2,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\legru,ragdolls()\posx+0.3,bloodygameheight-2.9,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\leglu,ragdolls()\posx-0.3,bloodygameheight-2.9,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\armr,ragdolls()\posx+0.6,bloodygameheight-1,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\arml,ragdolls()\posx-0.6,bloodygameheight-1,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\armru,ragdolls()\posx+0.6,bloodygameheight-2,ragdolls()\posz,#PB_Absolute)
        MoveEntity(ragdolls()\armlu,ragdolls()\posx-0.6,bloodygameheight-2,ragdolls()\posz,#PB_Absolute)
      Next
    EndIf
    
    If KeyboardReleased(#PB_Key_V) 
      Select hands
        Case 0
          hands=1
        Case 2
          hands=3
      EndSelect
    EndIf
    
    
    If KeyboardPushed(#PB_Key_T)
      ForEach ragdolls()
        ApplyEntityImpulse(ragdolls()\armlu ,0,-1,0,0,-1,0)
        ApplyEntityImpulse(ragdolls()\armru ,0,-1,0,0,-1,0)
        ApplyEntityImpulse(ragdolls()\leglu,0,-3,0,0,-1,0)
        ApplyEntityImpulse(ragdolls()\legru,0,-3,0,0,-1,0)
        ApplyEntityImpulse(ragdolls()\Head  ,0, 10,0,0,1,0)
        ;ApplyEntityForce(ragdolls()\HEAD,(Random(10)+5)*-1,0,(Random(10)+5)*-1) ;nearly ParachuteEffect
      Next
    EndIf
    
    If KeyboardPushed(#PB_Key_J)
      ForEach ragdolls()
        ApplyEntityImpulse(ragdolls()\Head,0,10,0)
      Next
    EndIf
    If KeyboardPushed(#PB_Key_K)
      SelectElement(ragdolls(),1)
      ApplyEntityImpulse(ragdolls()\Head,0,Random(10)+9,0)
      
    EndIf
    If KeyboardPushed(#PB_Key_I)
      I_f+0.1
      SelectElement(ragdolls(),0)
      ApplyEntityImpulse(ragdolls()\armlu,0,10+I_f,0)
      
    EndIf
    If KeyboardReleased(#PB_Key_I)
      i_f=0
    EndIf
    
    If KeyboardReleased(#PB_Key_U)
      Select dance
        Case 1
          dance=0
        Case 0
          dance=1
      EndSelect
      
    EndIf
    
    
    If KeyboardPushed(#PB_Key_F)
      ForEach ragdolls()
        If EntityY(ragdolls()\Body)<259
          ApplyEntityImpulse(ragdolls()\Body,0, 3,0,0,-10,0)
          ApplyEntityImpulse(ragdolls()\armlu  ,0, 3,0,0,-10,0)
          ApplyEntityImpulse(ragdolls()\armru  ,0, 3,0,0,-10,0)
          ApplyEntityImpulse(ragdolls()\leglu ,0, 3,0,0,-10,0)
          ApplyEntityImpulse(ragdolls()\legru ,0, 3,0,0,-10,0)
          ApplyEntityImpulse(ragdolls()\Head   ,0,6,0,0,0  ,0)
        EndIf
      Next
    EndIf
    
    If KeyboardPushed(#PB_Key_H)
      ForEach ragdolls()
        ApplyEntityImpulse(ragdolls()\armlu,0,1,0,0,-2,0)
        ApplyEntityImpulse(ragdolls()\armru,0,1,0,0,-2,0)
        ApplyEntityImpulse(ragdolls()\legl,0,-4,0,0,-20,0)
        ApplyEntityImpulse(ragdolls()\legr,0,-4,0,0,-20,0)
        ApplyEntityImpulse(ragdolls()\Head,0,5,0,0,0,0)
        ApplyEntityImpulse(ragdolls()\Body,0,4,0,0,10,0)
      Next
    EndIf
    ;Earthquake
    If KeyboardReleased(#PB_Key_Q)
      If earthquake
        ;Debug "Earthquake off"
        
        earthquake=0
      Else
        ; Debug "Earthquake on"
        earthquake=1
      EndIf
      
    EndIf
    
    ;KeyboardPushed Q
    ; plate rumbles (mimimal impulses in different dierctions)
    ;
    
    If KeyboardPushed(#PB_Key_Add)
      wg+1
      WorldGravity(wg)
    EndIf
    
    If KeyboardPushed(#PB_Key_Subtract)
      wg-1
      WorldGravity(wg)
    EndIf
    
    If KeyboardPushed(#PB_Key_G)
      
      ForEach ragdolls()
        ApplyEntityImpulse(ragdolls()\Head   ,0, -2,0)
        ApplyEntityImpulse(ragdolls()\legl , 0, Random(4),0,1,-6,0)
        ApplyEntityImpulse(ragdolls()\legr , 0, Random(4),0,1,-6,0)
        ApplyEntityImpulse(ragdolls()\armlu , 0, Random(1),0,0,6,0)
        ApplyEntityImpulse(ragdolls()\armru , 0, Random(1),0,0,6,0)
        
        ApplyEntityImpulse(ragdolls()\Body,0,-6,0,0,0,0)
      Next
    EndIf
    
    If KeyboardPushed(#PB_Key_Pad6)
      ForEach ragdolls()
        RotateEntity(ragdolls()\Head,0,10,0,#PB_Relative)
      Next
    EndIf
    If KeyboardPushed(#PB_Key_Pad4)
      ForEach ragdolls()
        RotateEntity(ragdolls()\Head,0,-10,0,#PB_Relative)
      Next
    EndIf
    If KeyboardPushed(#PB_Key_Pad1)
      ForEach ragdolls()
        RotateEntity(ragdolls()\Head,0,0,-5,#PB_Relative)
      Next
    EndIf
    If KeyboardPushed(#PB_Key_Pad3)
      ForEach ragdolls()
        RotateEntity(ragdolls()\Head,0,0,5,#PB_Relative)
      Next
    EndIf
    If KeyboardPushed(#PB_Key_Pad8)
      ForEach ragdolls()
        RotateEntity(ragdolls()\Head,-10,0,0,#PB_Relative)
      Next
    EndIf
    If KeyboardPushed(#PB_Key_Pad2)
      ForEach ragdolls()
        RotateEntity(ragdolls()\Head,10,0,0,#PB_Relative)
      Next
    EndIf
    
    If KeyboardPushed(#PB_Key_Left)
      KeyX = -#CameraSpeed
    ElseIf KeyboardPushed(#PB_Key_Right)
      KeyX = #CameraSpeed
    Else
      KeyX = 0
    EndIf
    
    If KeyboardPushed(#PB_Key_Up)
      KeyY = -#CameraSpeed
    ElseIf KeyboardPushed(#PB_Key_Down)
      KeyY = #CameraSpeed
    Else
      KeyY = 0
    EndIf
  EndIf
  If earthquake
    ;Debug EntityY(platte)
    rx.f=(Random(200)-99)/1000
    ry.f=(Random(200)-99)/1000
    rz.f=(Random(200)-99)/1000
    MoveEntity(platte, rx,ry+256,rz, #PB_Absolute)
    ApplyEntityForce(platte,0,0,50)
    
    ;Debug ApplyEntityImpulse(platte  ,0,0,0,0,100,0,#PB_World)
  Else
    ;MoveEntity(platte,0,256,0,#PB_Absolute)
  EndIf
  
  RotateCamera(camera, MouseY, MouseX, 0, #PB_Relative)
  MoveCamera  (camera, KeyX, 0, KeyY)
  
  ;Make it Bloody
  ExamineWorldCollisions(#True)
  While NextWorldCollision()
    
    If platte=FirstWorldCollisionEntity() Or platte=SecondWorldCollisionEntity()
      wcap=WorldCollisionAppliedImpulse()
      ;Debug GetY()
      
      impy=wcap;GetY()
      
      If impy>666
        killjoints()
        hands=0
      EndIf
      If impy>100
        dead=1
        ForEach ragdolls()
          SetEntityMaterial(ragdolls()\eyel, MaterialID(MatDeadEye))
          SetEntityMaterial(ragdolls()\eyer, MaterialID(MatDeadEye))
        Next
      EndIf
      
      If impy>20 ; blood with heavier impulses
        If impy>100
          impy=100
        EndIf
        
        WorldCollisionContact()
        AddElement(blood())
        blood()\id=CopyEntity(kontakt,#PB_Any)
        ScaleEntity(blood()\id,impy/5,1,impy/5,#PB_Relative)
        
        blood()\time=ElapsedMilliseconds()+(impy*impy/2)
        MoveEntity(blood()\id,GetX(),GetY(),GetZ(),#PB_Absolute)
        
      EndIf
      
    EndIf
    
  Wend
  ForEach blood()
    If ElapsedMilliseconds()>blood()\time+5000
      FreeEntity(blood()\id)
      DeleteElement(blood())
      If dead
        ForEach ragdolls()
          SetEntityMaterial(ragdolls()\eyel, MaterialID(MatEye))
          SetEntityMaterial(ragdolls()\eyer, MaterialID(MatEye))
          
        Next
        dead=0
      EndIf
      
    EndIf
  Next
  
  RenderWorld()
  FlipBuffers()
  
  While WindowEvent():Wend   
  
  ;steuerung
  MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
  MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
  
  KeyX = (KeyboardPushed(#PB_Key_Right)-KeyboardPushed(#PB_Key_Left))*#CameraSpeed
  Keyy = (KeyboardPushed(#PB_Key_Down)-KeyboardPushed(#PB_Key_Up))*#CameraSpeed
  
  RotateCamera(camera, MouseY, MouseX, 0, #PB_Relative)
  MoveCamera  (camera, KeyX, 0, KeyY)
  
  
  RenderWorld()
  FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1

End