Guest User

Untitled

a guest
May 16th, 2024
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; /////////////////////////////////////////////////////////////////////////////
  2. ;
  3. ;        ██████╗██████╗ ██╗     ██████╗  █████╗ ████████╗ ██████╗ ██████╗
  4. ;       ██╔════╝██╔══██╗██║     ██╔══██╗██╔══██╗╚══██╔══╝██╔═══██╗██╔══██╗
  5. ;       ██║     ██████╔╝██║     ██████╔╝███████║   ██║   ██║   ██║██████╔╝
  6. ;       ██║     ██╔═══╝ ██║     ██╔══██╗██╔══██║   ██║   ██║   ██║██╔══██╗
  7. ;       ╚██████╗██║     ███████╗██████╔╝██║  ██║   ██║   ╚██████╔╝██║  ██║
  8. ;        ╚═════╝╚═╝     ╚══════╝╚═════╝ ╚═╝  ╚═╝   ╚═╝    ╚═════╝ ╚═╝  ╚═╝
  9. ;
  10. ;
  11. ; MIT License
  12. ;
  13. ; Copyright (c) 2023 , CplBator
  14. ;
  15. ; Permission is hereby granted, free of charge, To any person obtaining a copy
  16. ; of this software And associated documentation files (the "Software"), To deal
  17. ; in the Software without restriction, including without limitation the rights
  18. ; To use, copy, modify, merge, publish, distribute, sublicense, And/Or sell
  19. ; copies of the Software, And To permit persons To whom the Software is
  20. ; furnished To do so, subject To the following conditions:
  21. ;
  22. ; The above copyright notice And this permission notice shall be included in all
  23. ; copies Or substantial portions of the Software.
  24. ;
  25. ; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS Or
  26. ; IMPLIED, INCLUDING BUT Not LIMITED To THE WARRANTIES OF MERCHANTABILITY,
  27. ; FITNESS For A PARTICULAR PURPOSE And NONINFRINGEMENT. IN NO EVENT SHALL THE
  28. ; AUTHORS Or COPYRIGHT HOLDERS BE LIABLE For ANY CLAIM, DAMAGES Or OTHER
  29. ; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT Or OTHERWISE, ARISING FROM,
  30. ; OUT OF Or IN CONNECTION With THE SOFTWARE Or THE USE Or OTHER DEALINGS IN THE
  31. ; SOFTWARE.
  32. ;
  33. ; /////////////////////////////////////////////////////////////////////////////
  34.  
  35. XIncludeFile "../Core/Maths/Math.pbi"
  36. XIncludeFile "../Core/Maths/Matrix4.pbi"
  37. XIncludeFile "../Core/Maths/Vector2.pbi"
  38. XIncludeFile "../Core/OpenGL/OpenGL.pbi"
  39.  
  40.  
  41. DeclareModule VertexBuffer  
  42.  
  43.   Enumeration
  44.     #UNDEFINED
  45.     #POINTS
  46.     #LINES
  47.     #LINE_STRIP
  48.     #LINE_LOOP
  49.     #TRIANGLES
  50.     #TRIANGLE_STRIP
  51.     #TRIANGLE_FAN
  52.     #QUADS
  53.     #QUAD_STRIP
  54.     #POLYGON
  55.   EndEnumeration
  56.  
  57.  
  58.   Structure sVertex
  59.     x.Math::real
  60.     y.Math::real
  61.     u.Math::real
  62.     v.Math::real
  63.     r.Math::real
  64.     g.Math::real
  65.     b.Math::real
  66.     a.Math::real
  67.   EndStructure
  68.  
  69.  
  70.   Interface iVertexBuffer
  71.     Free()
  72.     SetMode(mode.l)
  73.     Append(*vertex)
  74.     Clear()
  75.     Draw()
  76.     SetVertex(index.w, x.Math::real, y.Math::real, u.Math::real, v.Math::real , r.Math::real, g.Math::real, b.Math::real, a.Math::real)  
  77.     Count.w()
  78.     GetVertex.i(index.w)
  79.     Printer()
  80.   EndInterface
  81.  
  82.   Declare.i New()
  83.  
  84.  
  85. EndDeclareModule
  86.  
  87. Module VertexBuffer
  88.  
  89.   ;//////////////////////////////////////////////////////////////////////////////
  90.   ;
  91.   ;//////////////////////////////////////////////////////////////////////////////
  92.   Structure sVertexBuffer
  93.     *vtable
  94.     vertices_count.w
  95.     *buffer
  96.     need_update.l
  97.     vbo_id.i
  98.     vao_id.i
  99.     mode.l
  100.   EndStructure
  101.  
  102.   ;//////////////////////////////////////////////////////////////////////////////
  103.   ;
  104.   ;//////////////////////////////////////////////////////////////////////////////
  105.   Procedure.i New()
  106.     *vb.sVertexBuffer = AllocateStructure(sVertexBuffer)
  107.     If *vb <> #Null
  108.       *vb\vtable          = ?vtable
  109.       *vb\buffer          = #Null
  110.       *vb\vertices_count  = 0
  111.       *vb\need_update     = #True
  112.       *vb\mode            = #UNDEFINED
  113.       ProcedureReturn *vb
  114.     EndIf
  115.     ProcedureReturn #Null
  116.   EndProcedure
  117.  
  118.   ;//////////////////////////////////////////////////////////////////////////////
  119.   ;
  120.   ;//////////////////////////////////////////////////////////////////////////////
  121.   Procedure Free(*vb.sVertexBuffer)
  122.     If *vb\buffer <> #Null
  123.       FreeMemory(*vb\buffer)
  124.     EndIf
  125.   EndProcedure
  126.  
  127.   ;//////////////////////////////////////////////////////////////////////////////
  128.   ;
  129.   ;//////////////////////////////////////////////////////////////////////////////
  130.   Procedure SetMode(*vb.sVertexBuffer, mode.l)
  131.     *vb\mode = mode  
  132.   EndProcedure
  133.    
  134.   ;//////////////////////////////////////////////////////////////////////////////
  135.   ;
  136.   ;//////////////////////////////////////////////////////////////////////////////
  137.   Procedure Append(*vb.sVertexBuffer, *vertex.sVertex)
  138.     If *vb\buffer <> #Null
  139.       *vb\buffer = ReAllocateMemory(*vb\buffer, (*vb\vertices_count + 1) * SizeOf(sVertex))
  140.     Else
  141.       *vb\buffer = AllocateMemory(SizeOf(sVertex))
  142.     EndIf
  143.    
  144.     CopyMemory(*vertex, *vb\buffer + (*vb\vertices_count * SizeOf(sVertex)), SizeOf(sVertex))
  145.     *vb\vertices_count + 1
  146.     *vb\need_update = #True
  147.   EndProcedure
  148.  
  149.   ;//////////////////////////////////////////////////////////////////////////////
  150.   ;
  151.   ;//////////////////////////////////////////////////////////////////////////////
  152.   Procedure Clear(*vb.sVertexBuffer)
  153.     *vb\vertices_count = 0
  154.     *vb\need_update = #True
  155.     If *vb\buffer <> #Null
  156.       FreeMemory(*vb\buffer)
  157.     EndIf
  158.   EndProcedure
  159.  
  160.   ;//////////////////////////////////////////////////////////////////////////////
  161.   ;
  162.   ;//////////////////////////////////////////////////////////////////////////////
  163.   Procedure Update(*vb.sVertexBuffer)
  164.     If *vb\need_update = #True
  165.      
  166.      
  167.      
  168.       If *vb\vertices_count > 0
  169.         OpenGL::glGenVertexArrays(1,@*vb\vao_id)
  170.         OpenGL::glBindVertexArray(*vb\vao_id)
  171.         OpenGL::glEnableVertexAttribArray(0)
  172.          If Opengl::CheckError()
  173.           Debug "glGenVertexArrays : " + OpenGL::GetLastError()
  174.         EndIf
  175.        
  176.         OpenGL::glGenBuffers(1,@*vb\vbo_id)
  177.         OpenGL::glBindBuffer(OpenGL::#GL_ARRAY_BUFFER, *vb\vbo_id)
  178.         OpenGL::glBufferData(OpenGL::#GL_ARRAY_BUFFER, SizeOf(sVertex) * *vb\vertices_count, *vb\buffer, OpenGL::#GL_STATIC_DRAW)
  179.           If Opengl::CheckError()
  180.           Debug "glGenBuffers : " + OpenGL::GetLastError()
  181.         EndIf
  182.        
  183.        
  184.         ; xy
  185.         OpenGL::glVertexAttribPointer(0,2,OpenGL::#GL_FLOAT, OpenGL::#GL_FALSE, 8 * SizeOf(Float), 0)
  186.         OpenGL::glEnableVertexAttribArray(0)
  187.        
  188.         If Opengl::CheckError()
  189.           Debug "xy : " + OpenGL::GetLastError()
  190.         EndIf
  191.        
  192.         ;uv
  193.         OpenGL::glVertexAttribPointer(1,2,OpenGL::#GL_FLOAT, OpenGL::#GL_FALSE, 8 * SizeOf(Float), (2 * SizeOf(Float)))
  194.         OpenGL::glEnableVertexAttribArray(1)
  195.        
  196.         If Opengl::CheckError()
  197.           Debug "uv : " + OpenGL::GetLastError()
  198.         EndIf
  199.        
  200.         ;rgba
  201.         OpenGL::glVertexAttribPointer(2,4,OpenGL::#GL_FLOAT, OpenGL::#GL_FALSE, 8 * SizeOf(Float), (4 * SizeOf(Float)))
  202.         OpenGL::glEnableVertexAttribArray(2)
  203.        
  204.         If Opengl::CheckError()
  205.           Debug "rgba : " + OpenGL::GetLastError()
  206.         EndIf
  207.        
  208.         OpenGL::glBindBuffer(OpenGL::#GL_ARRAY_BUFFER, 0)
  209.         OpenGL::glBindVertexArray(0)
  210.        
  211.         If Opengl::CheckError()
  212.           Debug "update : " + OpenGL::GetLastError()
  213.         EndIf
  214.        
  215.        
  216.       EndIf      
  217.       *vb\need_update = #False
  218.     EndIf  
  219.   EndProcedure
  220.  
  221.   ;//////////////////////////////////////////////////////////////////////////////
  222.   ;
  223.   ;//////////////////////////////////////////////////////////////////////////////
  224.   Procedure Draw(*vb.sVertexBuffer)
  225.    
  226.     Update(*vb)
  227.    
  228.    
  229.     OpenGL::glBindVertexArray(*vb\vao_id)
  230.    
  231.      If Opengl::CheckError()
  232.           Debug "bind : " + OpenGL::GetLastError()
  233.         EndIf
  234.    
  235.     Select *vb\mode
  236.       Case #POINTS
  237.         OpenGL::glDrawArrays(OpenGL::#GL_POINTS,0,*vb\vertices_count)
  238.       Case  #LINES
  239.         OpenGL::glDrawArrays(OpenGL::#GL_LINES,0,*vb\vertices_count)
  240.       Case #LINE_STRIP
  241.         OpenGL::glDrawArrays(OpenGL::#GL_LINE_STRIP,0,*vb\vertices_count)
  242.       Case#LINE_LOOP
  243.         OpenGL::glDrawArrays(OpenGL::#GL_LINE_LOOP,0,*vb\vertices_count)
  244.       Case #TRIANGLES
  245.         OpenGL::glDrawArrays(OpenGL::#GL_TRIANGLES,0,*vb\vertices_count)
  246.        
  247.       Case#TRIANGLE_STRIP
  248.         OpenGL::glDrawArrays(OpenGL::#GL_TRIANGLE_STRIP,0,*vb\vertices_count)
  249.       Case#TRIANGLE_FAN
  250.         OpenGL::glDrawArrays(OpenGL::#GL_TRIANGLE_FAN,0,*vb\vertices_count)
  251.       Case #QUADS
  252.         OpenGL::glDrawArrays(OpenGL::#GL_QUADS,0,*vb\vertices_count)
  253.       Case #QUAD_STRIP
  254.         OpenGL::glDrawArrays(OpenGL::#GL_QUAD_STRIP,0,*vb\vertices_count)
  255.       Case#POLYGON
  256.         OpenGL::glDrawArrays(OpenGL::#GL_LINE_LOOP,0,*vb\vertices_count)
  257.     EndSelect    
  258.    
  259.    
  260.    If Opengl::CheckError()
  261.           Debug "draw : " + OpenGL::GetLastError()
  262.         EndIf
  263.   EndProcedure
  264.  
  265.   ;//////////////////////////////////////////////////////////////////////////////
  266.   ;
  267.   ;//////////////////////////////////////////////////////////////////////////////
  268.   Procedure SetVertex(*vb.sVertexBuffer, index.w, x.Math::real, y.Math::real, u.Math::real, v.Math::real , r.Math::real, g.Math::real, b.Math::real, a.Math::real)  
  269.     *ptr.sVertex = *vb\buffer + (SizeOf(sVertex) * index)
  270.     *ptr\x = x
  271.     *ptr\y = y
  272.     *ptr\u = u
  273.     *ptr\v = v
  274.     *ptr\r = r
  275.     *ptr\g = g
  276.     *ptr\b = b
  277.     *ptr\a = a
  278.   EndProcedure
  279.  
  280.   ;//////////////////////////////////////////////////////////////////////////////
  281.   ;
  282.   ;//////////////////////////////////////////////////////////////////////////////
  283.   Procedure.w Count(*self.sVertexBuffer)
  284.     ProcedureReturn *self\vertices_count
  285.   EndProcedure
  286.  
  287.   ;//////////////////////////////////////////////////////////////////////////////
  288.   ;
  289.   ;//////////////////////////////////////////////////////////////////////////////
  290.   Procedure.i GetVertex(*self.sVertexBuffer, index.w)
  291.     If index >= 0 And index < *self\vertices_count
  292.       *self\need_update = #True
  293.       ProcedureReturn *self\buffer + (SizeOf(VertexBuffer::sVertex) * index)
  294.     EndIf
  295.     ProcedureReturn #Null
  296.   EndProcedure
  297.  
  298.   ;//////////////////////////////////////////////////////////////////////////////
  299.   ;
  300.   ;//////////////////////////////////////////////////////////////////////////////
  301.   Procedure Printer(*vb.sVertexBuffer)
  302.     *ptr = *vb\buffer
  303.     For i = 0 To *vb\vertices_count-1
  304.       *v.sVertex = *ptr
  305.       Debug StrF(*v\x) + " : " + StrF(*v\y)
  306.       *ptr + SizeOf(sVertex)
  307.     Next
  308.   EndProcedure
  309.  
  310.  
  311.  
  312.   DataSection
  313.     vtable:
  314.     Data.i @Free()
  315.     Data.i @SetMode()
  316.     Data.i @Append()
  317.     Data.i @Clear()
  318.     Data.i @Draw()
  319.     Data.i @SetVertex()
  320.     Data.i @Count()
  321.     Data.i @GetVertex()
  322.     Data.i @Printer()
  323.   EndDataSection
  324.  
  325.  
  326.  
  327. EndModule
  328.  
  329.  
  330.  
  331.  
  332.  
  333.  
  334.  
  335.  
Advertisement
Add Comment
Please, Sign In to add comment