Graphics3D 800, 600, 0, 2
Type puppet
Field body
Field head
Field armL
Field armR
Field farmL
Field farmR
Field bodyYaw#
Field bodyDeltaYaw#
Field headYaw#
Field headPitch#
Field headDeltaPitch#
Field armLpitch#
Field armRpitch#
Field armLyaw#
Field armRyaw#
Field armRoll#
Field armRollTarget#
Field armYaw#
Field armYawTarget#
End Type
l = CreateLight(1)
RotateEntity l, 45,0,0
Global pup.puppet = quickpuppet()
Global mainCamera = CreateCamera()
PositionEntity mainCamera, 5, 2.5, -5
PointEntity mainCamera, pupody
;CameraClsColor mainCamera, 180, 170, 150
CameraClsColor mainCamera, 50, 70, 120
Global lookAtCamera = False
Global livemode = True
HidePointer()
While Not KeyHit(1)
If KeyHit(28) Then
livemode = Not livemode
If livemode Then
MoveMouse GraphicsWidth()/2, GraphicsHeight()/2
FlushMouse()
pupheadYaw = 0
pupheadPitch = 0
pupodyYaw = 0
HidePointer()
End If
End If
mx# = MouseXSpeed()
my# = MouseYSpeed()
mz# = MouseZSpeed()
If livemode Then
MoveMouse GraphicsWidth()/2, GraphicsHeight()/2
Else
ShowPointer()
End If
If KeyHit(59) Then puparmRollTarget = 0.0
If KeyHit(60) Then puparmRollTarget = 0.5
If KeyHit(61) Then puparmRollTarget = 1.0
If KeyHit(62) Then puparmRollTarget = 2.0
If KeyHit(63) Then puparmYawTarget = 0.0
If KeyHit(64) Then puparmYawTarget = 0.5
If KeyHit(65) Then puparmYawTarget = 1.0
If KeyHit(66) Then puparmYawTarget = 2.0
If (KeyHit(208)) Then
lookAtCamera = Not lookAtCamera
End If
If (KeyDown(200)) Then
pupheadYaw = pupheadYaw + mx
pupheadDeltaPitch = my
Else
If lookAtCamera Then
;pupheadYaw = pupheadYaw * 0.9
;pupheadPitch = pupheadPitch * 0.9
dx# = EntityX(mainCamera, True) - EntityX(puphead, True)
dy# = EntityY(mainCamera, True) - EntityY(puphead, True)
dz# = EntityZ(mainCamera, True) - EntityZ(puphead, True)
AlignToVector puphead, dx, dy, dz, 1, 0.2
pupheadYaw = EntityYaw(puphead)
pupheadPitch = EntityRoll(puphead)
End If
pupheadDeltaPitch = pupheadDeltaPitch - mz * 4
pupheadDeltaPitch = pupheadDeltaPitch * 0.8
If Not MouseDown(1) Then
puparmLpitch = puparmLpitch + my
puparmLyaw = puparmLyaw + mx
End If
If Not MouseDown(2) Then
puparmRpitch = puparmRpitch - my
puparmRyaw = puparmRyaw - mx
End If
End If
puparmRoll = puparmRoll + 0.1 * (puparmRollTarget - puparmRoll)
puparmYaw = puparmYaw + 0.1 * (puparmYawTarget - puparmYaw)
If MouseDown(1) Then
puparmLyaw = puparmLyaw * 0.9
puparmLpitch = puparmLpitch * 0.9
End If
If MouseDown(2) Then
puparmRyaw = puparmRyaw * 0.9
puparmRpitch = puparmRpitch * 0.9
End If
pupodyDeltaYaw = pupodyDeltaYaw * 0.9
pupodyDeltaYaw = pupodyDeltaYaw + 1.0 * (KeyDown(205) - KeyDown(203))
pupodyYaw = pupodyYaw + pupodyDeltaYaw
pupheadPitch = pupheadPitch - pupheadDeltaPitch
minArmPitch# = 25
maxArmPitch# = 120
minArmYaw# = 0
maxArmYaw# = 100
;Limits
If (puparmLPitch < -maxArmPitch) puparmLPitch = -maxArmPitch
If (puparmRPitch > maxArmPitch) puparmRPitch = maxArmPitch
If (puparmLPitch > minArmPitch) puparmLPitch = minArmPitch
If (puparmRPitch < -minArmPitch) puparmRPitch = -minArmPitch
If (puparmLYaw < -maxArmYaw) puparmLYaw = -maxArmYaw
If (puparmRYaw > maxArmYaw) puparmRYaw = maxArmYaw
If (puparmLYaw > minArmYaw) puparmLYaw = minArmYaw
If (puparmRYaw < -minArmYaw) puparmRYaw = -minArmYaw
;limit to make sure arms do not cross
;EntityColor pupfarmL, 255, 255, 255
;EntityColor pupfarmR, 255, 255, 255
critArmYaw# = 85
If (puparmRYaw > critArmYaw And puparmLYaw < -critArmYaw) Then
dPitch# = puparmRPitch + puparmLPitch
If Abs(dPitch) < 20 Then
;EntityColor pupfarmL, 255, 50, 50
;EntityColor pupfarmR, 255, 50, 50
If (dPitch < 0) Then
puparmRPitch = puparmRPitch - 0.5
puparmLPitch = puparmLPitch - 0.5
puparmRYaw = puparmRYaw - 0.5
puparmLYaw = puparmLYaw - 0.5
Else
puparmRPitch = puparmRPitch + 0.5
puparmLPitch = puparmLPitch + 0.5
puparmRYaw = puparmRYaw + 0.5
puparmLYaw = puparmLYaw + 0.5
End If
End If
End If
maxHeadYaw# = 80
maxHeadPitch# = 50
minHeadPitch# = 30
If (pupheadYaw < -maxHeadYaw) pupheadYaw = -maxHeadYaw
If (pupheadYaw > maxHeadYaw) pupheadYaw = maxHeadYaw
If (pupheadPitch < -minHeadPitch) pupheadPitch = -minHeadPitch
If (pupheadPitch > maxHeadPitch) pupheadPitch = maxHeadPitch
RotateEntity pupody, 0, pupodyYaw, 0
RotateEntity puphead, 0, pupheadYaw, pupheadPitch
RotateEntity puparmL, puparmLPitch, puparmLyaw+40, -puparmLyaw * puparmRoll
RotateEntity puparmR, puparmRPitch, puparmRyaw-40, puparmRyaw * puparmRoll
RotateEntity pupfarmL, puparmLPitch, puparmLyaw*puparmYaw+20, 0
RotateEntity pupfarmR, puparmRPitch, puparmRyaw*puparmYaw-20, 0
SetBuffer BackBuffer()
RenderWorld()
Color 255,100,0
y = GraphicsHeight() - 160
x = 10
dy = 16
Text x, y+0*dy, "F1-F4: Set arm roll extent"
Text x, y+1*dy, "F5-F8: Set arm yaw extent"
If (KeyDown(200)) Then
Text x, y+2*dy, "Mouse X/Y: Look around"
Else
Text x, y+2*dy, "Mouse X/Y: Move Arms"
End If
Text x, y+3*dy, "Mouse Wheel: Look up/down"
Text x, y+4*dy, "Mouse LB: Relax Left Arm"
Text x, y+5*dy, "Mouse RB: Relax Right Arm"
Text x, y+6*dy, "Left+Right Arrows: Rotate"
Text x, y+7*dy, "Down Arrow: Look at camera"
Text x, y+8*dy, "Up Arrow: Switch to look mode"
Flip
Wend
End
Function quickpuppet.puppet()
p.puppet = New puppet
pody = CreateCube()
phead = CreateSphere(8, pody)
ScaleMesh pody, 0.5, 1.4, 1
ScaleMesh phead, 0.8, 1, 0.7
PositionMesh phead, 0, 0.3, 0
eye1 = CreateSphere(4, phead)
ScaleEntity eye1, 0.3, 0.3, 0.3
PositionEntity eye1, 0.55,0.3,-0.3
eye2 = CreateSphere(4, phead)
ScaleEntity eye2, 0.3, 0.3, 0.3
PositionEntity eye2, 0.55,0.3,0.3
PositionEntity phead, 0,2,0
parmL = CreateCylinder(6, True, pody)
RotateMesh parmL, 90,0,0
FitMesh parmL, -0.3, -0.3, 0, 0.6, 0.6, 2.0
RotateMesh parmL, 45,0,0
PositionEntity parmL, 0, 1, 1
parmR = CopyMesh(parmL, pody)
RotateMesh parmR, 0, 180, 0
PositionEntity parmR, 0, 1, -1
pfarmL = CopyMesh(parmL, parmL)
PositionEntity pfarmL, 0, -1.5, 1.5
RotateMesh pfarmL, 20, 0, 30
pfarmR = CopyMesh(parmR, parmR)
PositionEntity pfarmR, 0, -1.5, -1.5
RotateMesh pfarmR, -20, 10, 30
parmRollTarget = 0.5
parmYawTarget = 1.0
Return p
End Function