Issue with lines using 'opengl' lib
Posted: Wed Oct 07, 2020 7:17 pm
I am trying perform a pseudo 2D lines manual dealing, and want to play with different widths of the lines.
But, at least here, the line has squared lapses, which might be due to VGA type, does someone know about this ?
The tip allows to manage each one of four points in a cubic Bezier scheme.
Please compile using 'opengl' subsystem library to see the failures.
But, at least here, the line has squared lapses, which might be due to VGA type, does someone know about this ?
The tip allows to manage each one of four points in a cubic Bezier scheme.
Please compile using 'opengl' subsystem library to see the failures.
Code: Select all
InitEngine3D():InitSprite():InitKeyboard():InitMouse():InitSound()
OpenWindow(0,0,0,1280,720,"",#PB_Window_BorderLess|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(0),0,0,1280,720,1,0,0,#PB_Screen_WaitSynchronization)
Add3DArchive(#PB_Compiler_Home+"examples/3d/Data/Textures",#PB_3DArchive_FileSystem)
Enumeration Camaras
#Camara
EndEnumeration
Enumeration Luces
#Luz
EndEnumeration
Enumeration Texturas
#LineaTextura
EndEnumeration
Enumeration Materiales
#LineaMaterial
EndEnumeration
Enumeration Mallas
#LineaMalla
#CoordenadaBezier1Malla
#CoordenadaBezier2Malla
EndEnumeration
Enumeration Entidades
#CoordenadaBezier1
#CoordenadaBezier2
EndEnumeration
Enumeration Nodos
#Pivotcamara
EndEnumeration
Structure D3DXVECTOR3
x.f
y.f
z.f
EndStructure
Macro OrbitarObjeto1SobreObjeto0(tecla=LeftControl,tipo1=Camera,objeto1=#Camara,tipo0=Node,objeto0=#Pivotcamara); <- el 'objeto1' orbita sobre el 'objeto0', y este debe ser nodo de 'objeto1'
If KeyboardPushed(#PB_Key_#tecla#); <- mover el punto de vista
;para desplazar la camara hacia delante, atras, arriba, abajo, izq o der
If mdx.f Or mdy.f Or mdz.f
If mmb.b
Move#tipo1#(objeto1#,mdx.f/200,-mdy.f/200,0,#PB_Local)
Else
Rotate#tipo0#(objeto0#,-mdy.f,-mdx.f,0,#PB_Relative)
If mdz
Move#tipo1#(objeto1#,0,0,-mdz.f,#PB_Local)
EndIf
EndIf
EndIf
EndMacro
Macro crealineaBezier()
CreateMaterial(#LineaMaterial,LoadTexture(#LineaTextura,"White.jpg")):DisableMaterialLighting(#LineaMaterial,#True)
CreateMesh(#LineaMalla,#PB_Mesh_LineStrip,#PB_Mesh_Static)
DataSection
puntosBezier:
Data.f -1,0,0.5,-0.333333,1,0.5,0.333333,-1,0.5,1,0,0.5
EndDataSection
Dim puntos.D3DXVECTOR3(3)
Restore puntosBezier
For i.a=0 To 3
Read.f puntos(i.a)\x
Read.f puntos(i.a)\y
Read.f puntos(i.a)\z
MeshVertex(puntos(i)\x,puntos(i)\y,puntos(i)\z,i/3,i/3,$33F422)
Next
FinishMesh(#False):SetMeshMaterial(#LineaMalla,MaterialID(#LineaMaterial))
AttachNodeObject(#Pivotcamara,MeshID(#LineaMalla))
glLineWidth_(15) ; para poner grosor a las lineas compilar con el subsystem 'opengl'
EndMacro
Procedure LineaBeziercubico(Array lp.D3DXVECTOR3(1),res.f=0.02)
Protected t0.f=0.0,t1.f=1.0,b.D3DXVECTOR3,b0.D3DXVECTOR3=lp(3),pt03.f,pt13.f,pt102.f,pt012.f
UpdateMesh(#LineaMalla,0)
While t1.f>=-res
pt03.f=Pow(t0.f,2):pt13.f=Pow(t1.f,2):pt102.f=t1.f*pt03.f:pt012.f=t0.f*pt13.f:pt03.f*t0.f:pt13.f*t1.f
b\x=lp(0)\x*pt03.f+3*lp(1)\x*pt102.f+3*lp(2)\x*pt012.f+lp(3)\x*pt13.f
b\y=lp(0)\y*pt03.f+3*lp(1)\y*pt102.f+3*lp(2)\y*pt012.f+lp(3)\y*pt13.f
b\z=lp(0)\z*pt03.f+3*lp(1)\z*pt102.f+3*lp(2)\z*pt012.f+lp(3)\z*pt13.f
MeshVertexPosition(b\x,b\y,b\z)
b0=b
t0.f+res.f:t1.f-res.f
Wend
FinishMesh(#False)
EndProcedure
CreateLight(#Luz,$EEEEEE,4,4,2,#PB_Light_Point)
SetLightColor(#Luz,#PB_Light_SpecularColor,$FFFFFF):AmbientColor($222222)
CreateCamera(#Camara,0,0,100,100):CreateNode(#Pivotcamara,0,0,0):AttachNodeObject(#Pivotcamara,CameraID(#Camara)):CameraRange(#Camara,0.1,10000):CameraBackColor(#Camara,$181911):MoveCamera(#Camara,0,0,8.33,#PB_Absolute)
Pitch(NodeID(#Pivotcamara),-90,#PB_World)
crealineaBezier()
CreateSphere(#CoordenadaBezier1Malla,0.05)
CreateEntity(#CoordenadaBezier1,MeshID(#CoordenadaBezier1Malla),#PB_Material_None)
CreateEntity(#CoordenadaBezier2,MeshID(#CoordenadaBezier1Malla),#PB_Material_None)
MoveEntity(#CoordenadaBezier1,puntos(1)\x,puntos(1)\y,puntos(1)\z,#PB_Absolute)
MoveEntity(#CoordenadaBezier2,puntos(2)\x,puntos(2)\y,puntos(2)\z,#PB_Absolute)
AttachNodeObject(#Pivotcamara,EntityID(#CoordenadaBezier1))
AttachNodeObject(#Pivotcamara,EntityID(#CoordenadaBezier2))
Repeat
ExamineMouse():ExamineKeyboard()
lmb.b=MouseButton(#PB_MouseButton_Left):rmb.b=MouseButton(#PB_MouseButton_Right)
mdx.f=MouseDeltaX()/10:mdy.f=MouseDeltaY()/10:mdz.f=MouseWheel()/3
Eventodeventana.i=WindowEvent()
LineaBeziercubico(puntos.D3DXVECTOR3(),0.05)
OrbitarObjeto1SobreObjeto0()
ElseIf lmb.b
If KeyboardPushed(#PB_Key_LeftShift)
puntos(0)\x+mdx/20:puntos(0)\y-mdy/20
MoveEntity(#CoordenadaBezier1,puntos(1)\x,puntos(1)\y,puntos(1)\z,#PB_Absolute)
MoveEntity(#CoordenadaBezier2,puntos(2)\x,puntos(2)\y,puntos(2)\z,#PB_Absolute)
Else
puntos(1)\x+mdx/20:puntos(1)\y-mdy/20
MoveEntity(#CoordenadaBezier1,puntos(1)\x,puntos(1)\y,puntos(1)\z,#PB_Absolute)
MoveEntity(#CoordenadaBezier2,puntos(2)\x,puntos(2)\y,puntos(2)\z,#PB_Absolute)
EndIf
ElseIf rmb.b
If KeyboardPushed(#PB_Key_LeftShift)
puntos(3)\x+mdx/20:puntos(3)\y-mdy/20
MoveEntity(#CoordenadaBezier1,puntos(1)\x,puntos(1)\y,puntos(1)\z,#PB_Absolute)
MoveEntity(#CoordenadaBezier2,puntos(2)\x,puntos(2)\y,puntos(2)\z,#PB_Absolute)
Else
puntos(2)\x+mdx/20:puntos(2)\y-mdy/20
MoveEntity(#CoordenadaBezier1,puntos(1)\x,puntos(1)\y,puntos(1)\z,#PB_Absolute)
MoveEntity(#CoordenadaBezier2,puntos(2)\x,puntos(2)\y,puntos(2)\z,#PB_Absolute)
EndIf
EndIf
TimeSinceLastFrame.i=RenderWorld(50)
FlipBuffers():Delay(9)
Until KeyboardPushed(#PB_Key_Escape)