;
; ------------------------------------------------------------
;
; PureBasic - ConvertWorldToLocalPosition
;
; (c) Fantaisie Software
;
; ------------------------------------------------------------
;
IncludeFile #PB_Compiler_Home + "examples/3d/Screen3DRequester.pb"
; Кнопка влево, чтобы нарисовать
; Кнопка вправо, чтобы очистить
Structure Vector3
x.f
y.f
z.f
EndStructure
Declare DrawOnWhiteBoard()
Define.f KeyX, KeyY, MouseX, MouseY
Global Entity.i, P.Vector3
LoadFont(0, "Arial" , 8, #PB_Font_Bold)
#CameraSpeed = 3
Macro InitImage()
StartDrawing(ImageOutput(0))
Box(0, 0, 160, 120, 0)
DrawingMode(#PB_2DDrawing_Outlined)
Box(0, 0, 160, 120, RGB(255, 255, 255))
DrawingFont(FontID(0))
DrawText(5, 10, "левая кнопка для рисования", RGB(155, 80, 0), 0)
DrawText(5, 40, "правая кнопка для очистки", RGB(155, 80, 0), 0)
StopDrawing()
EndMacro
If InitEngine3D()
InitSprite()
InitKeyboard()
InitMouse()
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Models", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/GUI", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Packs/skybox.zip", #PB_3DArchive_Zip)
Parse3DScripts()
If Screen3DRequester()
CreateMesh(0)
MeshVertexPosition(-1, 0, 1)
MeshVertexNormal(0,-1,0)
MeshVertexTextureCoordinate(1,0)
MeshVertexPosition( 1, 0, 1)
MeshVertexNormal(0,-1,0)
MeshVertexTextureCoordinate(0,0)
MeshVertexPosition( 1, 0, -1)
MeshVertexNormal(0,-1,0)
MeshVertexTextureCoordinate(0,1)
MeshVertexPosition(-1, 0, -1)
MeshVertexNormal(0,-1,0)
MeshVertexTextureCoordinate(1,1)
MeshFace(0, 1, 2)
MeshFace(0, 2, 3)
MeshFace(2, 1, 0)
MeshFace(3, 2, 0)
FinishMesh(1)
CreateImage(0, 160, 120)
InitImage()
CreateTexture(0, 160, 120)
CreateMaterial(0, TextureID(0))
MaterialBlendingMode(0, #PB_Material_Add)
DisableMaterialLighting(0, 1)
MaterialCullingMode(0, 1)
Entity = CreateEntity(#PB_Any, MeshID(0), MaterialID(0), 30, 40, 50)
ScaleEntity(Entity, 80, 1, 60)
CreateLight(0, RGB(0,0,255), 100.0, 0, 0)
CreateCamera(0, 0, 0, 100, 100)
MoveCamera(0, 10, 350, -150, #PB_Absolute)
CameraLookAt(0, 30, 40, 50)
CameraBackColor(0, RGB(0, 0, 90))
ShowGUI(128, 1) ; Отображение GUI, полупрозрачность и отображение курсора мыши.
SkyBox("stevecube.jpg")
MouseLocate(CameraViewWidth(0)/2, CameraViewHeight(0)/2)
Repeat
Screen3DEvents()
If ExamineMouse()
InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))
MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
; Тест мыши
If MouseRayCast(0, MouseX(), MouseY(), -1) = Entity
DrawOnWhiteBoard()
EndIf
EndIf
If ExamineKeyboard()
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
RotateEntity(Entity, 0.1, 0.1, 0.1, #PB_Relative)
StartDrawing(TextureOutput(0))
DrawImage(ImageID(0), 0, 0)
StopDrawing()
CameraLookAt(0, 30, 40, 50)
MoveCamera (0, KeyX, 0, KeyY)
RenderWorld()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
EndIf
Else
MessageRequester("Ошибка", "3D Движок не может быть инициализирован", 0)
EndIf
End
Procedure DrawOnWhiteBoard()
Protected x, y
Static Mem, Memx, Memy
StartDrawing(ImageOutput(0))
If MouseButton(#PB_MouseButton_Left)
ConvertWorldToLocalPosition(EntityID(Entity), PickX(), PickY(), PickZ())
x = (1 - GetX()) * 80
y = (1 - GetZ()) * 60
If x>0 And x<160 And y>0 And y<120
If mem = 0
Memx = x
Memy = y
mem = 1
EndIf
LineXY(memx, memy, x, y, $FF)
Memx = x
Memy = y
EndIf
ElseIf MouseButton(#PB_MouseButton_Right)
StopDrawing()
InitImage()
Else
mem = 0
EndIf
StopDrawing()
EndProcedure