Edit Mesh with Mouse and Keyboard
Posted: Thu Sep 08, 2016 5:09 am
Code updated Sept. 9, 2016
Issues:
Line 62: GetMeshData() crashes on OS X.
OpenGL doesn't work in Windows.
Comtois has an alternative method in this link.
Issues:
Line 62: GetMeshData() crashes on OS X.
OpenGL doesn't work in Windows.
Comtois has an alternative method in this link.
Code: Select all
;Sept. 9, 2016 - J. Baker & applePi
;PureBasic v5.43 - Tested on Windows XP - Crashes on OS X (possible bug with GetMeshData())
;Use mouse to select vertex. Move vertex with arrow keys.
#CameraSpeed = 0.4
Global Dim MeshVertexData.PB_MeshVertex(0)
Declare UpdateMatrix()
Global x.f, y.f, z.f, Entity.i, Verts.i
Procedure UpdateVertColor()
For Verts = 1 To MeshVertexCount(0)
SetEntityMaterial(Verts, MaterialID(1))
Next
EndProcedure
IncludeFile #PB_Compiler_Home + "examples/3d/Screen3DRequester.pb"
If InitEngine3D()
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Scripts", #PB_3DArchive_FileSystem)
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/GUI", #PB_3DArchive_FileSystem)
Parse3DScripts()
InitSprite()
InitKeyboard()
InitMouse()
If Screen3DRequester()
MaterialFilteringMode(#PB_Default, #PB_Material_Anisotropic, 8)
CreateMaterial(0, LoadTexture(0, "Caisse.png"))
SetMaterialColor(0, #PB_Material_SelfIlluminationColor, RGB(255, 255, 255))
MaterialCullingMode(0, #PB_Material_NoCulling)
GetScriptMaterial(1, "Color/Red")
SetMaterialColor(1, #PB_Material_SelfIlluminationColor, RGB(255, 0, 0))
GetScriptMaterial(2, "Color/Yellow")
SetMaterialColor(2, #PB_Material_SelfIlluminationColor, RGB(255, 255, 0))
CreateMesh(0, #PB_Mesh_TriangleList, #PB_Mesh_Dynamic)
MeshVertexPosition(-128,128,0)
MeshVertexTextureCoordinate(0,0)
MeshVertexPosition(128,128,0)
MeshVertexTextureCoordinate(0,1)
MeshVertexPosition(128,-128,0)
MeshVertexTextureCoordinate(1,1)
MeshVertexPosition(-128,-128,0)
MeshVertexTextureCoordinate(1,0)
MeshFace(2,1,0)
MeshFace(0,3,2)
FinishMesh(#True) ;-texture doesn't show when false but then you can not edit
SetMeshMaterial(0, MaterialID(0))
CreateEntity(0, MeshID(0), #PB_Material_None)
GetMeshData(0, 0, MeshVertexData(), #PB_Mesh_Vertex, 0, MeshVertexCount(0) -1)
For Verts = 1 To MeshVertexCount(0)
CreateCube(Verts, 8)
CreateEntity(Verts, MeshID(Verts), MaterialID(1), MeshVertexData(Verts-1)\x, MeshVertexData(Verts-1)\y, MeshVertexData(Verts-1)\z)
Next
CreateCamera(0, 0, 0, 100, 100)
MoveCamera(0, 0, 0, 500, #PB_Absolute)
ShowGUI(128, 1)
Repeat
Screen3DEvents()
ExamineKeyboard()
If ExamineMouse()
MouseX = -MouseDeltaX() * #CameraSpeed * 0.05
MouseY = -MouseDeltaY() * #CameraSpeed * 0.05
InputEvent3D(MouseX(), MouseY(), MouseButton(#PB_MouseButton_Left))
If MouseButton(#PB_MouseButton_Left) <> 0
Entity = MousePick(0, MouseX(), MouseY())
SetWindowTitle(0, "Entity = " + Str(Entity))
If Entity > 0
UpdateVertColor()
MoveVert = 1
SetEntityMaterial(Entity, MaterialID(2))
ElseIf Entity = -1
MoveVert = 0
UpdateVertColor()
EndIf
EndIf
EndIf
If KeyboardReleased(#PB_Key_W)
If wire = 0
MaterialShadingMode(0,#PB_Material_Wireframe)
wire ! 1
Else
MaterialShadingMode(0,#PB_Material_Solid)
wire ! 1
EndIf
EndIf
If MoveVert = 1
If KeyboardPushed(#PB_Key_Left)
MoveEntity(Entity, -5, 0, 0, #PB_Relative)
x = MeshVertexData(Entity -1)\x: y = MeshVertexData(Entity -1)\y
x = EntityX(Entity) :UpdateMatrix()
ElseIf KeyboardPushed(#PB_Key_Right)
MoveEntity(Entity, 5, 0, 0, #PB_Relative)
x = MeshVertexData(Entity -1)\x: y = MeshVertexData(Entity -1)\y
x = EntityX(Entity) :UpdateMatrix()
ElseIf KeyboardPushed(#PB_Key_Up)
MoveEntity(Entity, 0, 5, 0, #PB_Relative)
x = MeshVertexData(Entity -1)\x: y = MeshVertexData(Entity -1)\y
y = EntityY(Entity):UpdateMatrix()
ElseIf KeyboardPushed(#PB_Key_Down)
MoveEntity(Entity, 0, -5, 0, #PB_Relative)
x = MeshVertexData(Entity -1)\x: y = MeshVertexData(Entity -1)\y
y = EntityY(Entity) :UpdateMatrix()
EndIf
EndIf
RenderWorld()
FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape) Or Quit = 1
EndIf
Else
MessageRequester("Error", "The 3D Engine can't be initialized", 0)
EndIf
End
Procedure UpdateMatrix()
MeshVertexData(Entity -1)\x = x
MeshVertexData(Entity -1)\y = y
MeshVertexData(Entity -1)\z = z
SetMeshData(0,0, MeshVertexData(), #PB_Mesh_Vertex, 0, MeshVertexCount(0)-1)
EndProcedure