Advertisement
sufokmpc

matrix.pb

Dec 24th, 2011
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; *---------------------------------*
  2. ; *   OpenGL Base                   *
  3. ; *   xorc1zt                       *
  4. ; *   2011                          *
  5. ; *---------------------------------*
  6.  
  7.  
  8. ; ** IMPORTANT ** : OpenGL Matrix are column-major ordered
  9. ;
  10. ;   m[0] m[4] m[8]  m[12]     m[Xx] m[Yx] m[Zx] m[Tx]
  11. ;   m[1] m[5] m[9]  m[13]     m[Xy] m[Yy] m[Zy] m[Ty]
  12. ;   m[2] m[6] m[10] m[14] ==> m[Xz] m[Yz] m[Zz] m[Tz]
  13. ;   m[3] m[7] m[11] m[15]     m[Xw] m[Yw] m[Zw] m[Tw]
  14. ;
  15. ;
  16.  
  17. EnableExplicit
  18.  
  19. #MATRIX_SIZEBYTE = 64 ; 16*float
  20.  
  21. Interface MATRIX
  22.   debugValues()
  23.   getAddress()
  24.   identity()
  25.   multiply(MATRIX)
  26.   rotateX(angledegree.f)
  27.   rotateY(angledegree.f)
  28.   rotateZ(angledegree.f)
  29.   translate(x.f, y.f, z.f)
  30.   perspective(angle.f, near.f, far.f, aspect.f)
  31.   orthogonal(left.f, right.f, bottom.f, top.f, near.f, far.f)
  32.   lookAt(eyeX.f, eyeY.f, eyeZ.f, centerX.f, centerY.f, centerZ.f, upX.f, upY.f, upZ.f)
  33.   push()
  34.   pop()
  35.   destroy()
  36. EndInterface
  37.  
  38. Structure PARENTSTR
  39.   value.f[16]
  40.   *parent.PARENTSTR
  41. EndStructure
  42.  
  43. Structure MATRIXSTR
  44.   VTable.l
  45.   value.f[16]
  46.   label.s
  47.   *parent.PARENTSTR
  48. EndStructure
  49.  
  50. Enumeration
  51.   #Xx
  52.   #Xy
  53.   #Xz
  54.   #Xw
  55.   #Yx
  56.   #Yy
  57.   #Yz
  58.   #Yw
  59.   #Zx
  60.   #Zy
  61.   #Zz
  62.   #Zw
  63.   #Tx
  64.   #Ty
  65.   #Tz
  66.   #Tw
  67. EndEnumeration
  68.  
  69. Declare   crossProduct( Array *a.f(1), Array *b.f(1), Array *result.f(1))
  70. Declare   normalize(Array *a.f(1))
  71. Declare   debugValues(*Self.MATRIXSTR)
  72. Declare.i getAddress(*Self.MATRIXSTR)
  73. Declare   identity(*Self.MATRIXSTR)
  74. Declare   multiply(*self.MATRIXSTR, *matrix.MATRIXSTR)
  75. Declare   rotateX(*Self.MATRIXSTR, angledegree.f)
  76. Declare   rotateY(*Self.MATRIXSTR, angledegree.f)
  77. Declare   rotateZ(*Self.MATRIXSTR, angledegree.f)
  78. Declare   translate(*Self.MATRIXSTR, x.f, y.f, z.f)
  79. Declare   perspective(*Self.MATRIXSTR, angle.f, near.f, far.f, aspect.f)
  80. Declare   orthogonal(*Self.MATRIXSTR, left.f, right.f, bottom.f, top.f, near.f, far.f)
  81. Declare   lookAt(*Self.MATRIXSTR, eyeX.f, eyeY.f, eyeZ.f, centerX.f, centerY.f, centerZ.f, upX.f, upY.f, upZ.f)
  82. Declare   push(*Self.MATRIXSTR)
  83. Declare   pop(*Self.MATRIXSTR)
  84. Declare   destroy(*Self.MATRIXSTR)
  85. Declare.i createMatrix(label.s)  
  86.  
  87. Procedure crossProduct( Array *a.f(1), Array *b.f(1), Array *result.f(1))
  88.   traceFunction("crossProduct()")
  89.  
  90.   *result(0) = ( *a(1) * *b(2) ) - ( *b(1) * *a(2) )
  91.   *result(1) = ( *a(2) * *b(0) ) - ( *b(2) * *a(0) )
  92.   *result(2) = ( *a(0) * *b(1) ) - ( *b(0) * *a(1) )
  93. EndProcedure
  94.  
  95. Procedure normalize(Array *a.f(1))
  96.   traceFunction("normalize()")
  97.  
  98.   Define mag.f = Sqr( *a(0) * *a(0) + *a(1) * *a(1) + *a(2) * *a(2) )
  99.   *a(0) / mag
  100.   *a(1) / mag
  101.   *a(2) / mag
  102. EndProcedure
  103.  
  104. Procedure debugValues(*Self.MATRIXSTR)
  105.   traceFunction("debugValues()")
  106.  
  107.   Debug "---- MATRIX: "+*self\label+" ----"
  108.   Debug StrF( *self\value[#Xx] )+" "+StrF( *self\value[#Yx] )+" "+StrF( *self\value[#Zx] )+" "+StrF( *self\value[#Tx] )
  109.   Debug StrF( *self\value[#Xy] )+" "+StrF( *self\value[#Yy] )+" "+StrF( *self\value[#Zy] )+" "+StrF( *self\value[#Ty] )
  110.   Debug StrF( *self\value[#Xz] )+" "+StrF( *self\value[#Yz] )+" "+StrF( *self\value[#Zz] )+" "+StrF( *self\value[#Tz] )
  111.   Debug StrF( *self\value[#Xw] )+" "+StrF( *self\value[#Yw] )+" "+StrF( *self\value[#Zw] )+" "+StrF( *self\value[#Tw] )
  112. EndProcedure
  113.  
  114. Procedure.i getAddress(*Self.MATRIXSTR)
  115.   traceFunction("getAddress()")
  116.   ProcedureReturn @*self\value[0]
  117. EndProcedure
  118.  
  119. Procedure identity(*Self.MATRIXSTR)
  120.   traceFunction("indentity()")
  121.  
  122.   CompilerIf 1
  123.     With *Self
  124.       \value[#Xx] = 1
  125.       \value[#Xy] = 0
  126.       \value[#Xz] = 0
  127.       \value[#Xw] = 0
  128.      
  129.       \value[#Yx] = 0
  130.       \value[#Yy] = 1
  131.       \value[#Yz] = 0
  132.       \value[#Yw] = 0
  133.      
  134.       \value[#Zx] = 0
  135.       \value[#Zy] = 0
  136.       \value[#Zz] = 1
  137.       \value[#Zw] = 0
  138.      
  139.       \value[#Tx] = 0
  140.       \value[#Ty] = 0
  141.       \value[#Tz] = 0
  142.       \value[#Tw] = 1
  143.     EndWith
  144.   CompilerElse
  145.     CopyMemory(?MatrixIdentity, @*self\value[0], #MATRIX_SIZEBYTE)
  146.   CompilerEndIf
  147. EndProcedure
  148.  
  149. Procedure multiply(*self.MATRIXSTR, *matrix.MATRIXSTR)
  150.   Define tempmatrix.MATRIXSTR
  151.  
  152.   traceFunction("multiply()")
  153.  
  154.   tempmatrix\value[#Xx] = (*self\value[0]  * *matrix\value[0])
  155.   tempmatrix\value[#Xx] + (*self\value[4]  * *matrix\value[1])
  156.   tempmatrix\value[#Xx] + (*self\value[8]  * *matrix\value[2])
  157.   tempmatrix\value[#Xx] + (*self\value[12] * *matrix\value[3])
  158.  
  159.   tempmatrix\value[#Xy] = (*self\value[1]  * *matrix\value[0])
  160.   tempmatrix\value[#Xy] + (*self\value[5]  * *matrix\value[1])
  161.   tempmatrix\value[#Xy] + (*self\value[9]  * *matrix\value[2])
  162.   tempmatrix\value[#Xy] + (*self\value[13] * *matrix\value[3])
  163.  
  164.   tempmatrix\value[#Xz] = (*self\value[2]  * *matrix\value[0])
  165.   tempmatrix\value[#Xz] + (*self\value[6]  * *matrix\value[1])
  166.   tempmatrix\value[#Xz] + (*self\value[10] * *matrix\value[2])
  167.   tempmatrix\value[#Xz] + (*self\value[14] * *matrix\value[3])
  168.  
  169.   tempmatrix\value[#Xw] = (*self\value[3]  * *matrix\value[0])
  170.   tempmatrix\value[#Xw] + (*self\value[7]  * *matrix\value[1])
  171.   tempmatrix\value[#Xw] + (*self\value[11] * *matrix\value[2])
  172.   tempmatrix\value[#Xw] + (*self\value[15] * *matrix\value[3])  
  173.  
  174.   tempmatrix\value[#Yx] = (*self\value[0]  * *matrix\value[4])
  175.   tempmatrix\value[#Yx] + (*self\value[4]  * *matrix\value[5])
  176.   tempmatrix\value[#Yx] + (*self\value[8]  * *matrix\value[6])
  177.   tempmatrix\value[#Yx] + (*self\value[12] * *matrix\value[7])
  178.  
  179.   tempmatrix\value[#Yy] = (*self\value[1]  * *matrix\value[4])
  180.   tempmatrix\value[#Yy] + (*self\value[5]  * *matrix\value[5])
  181.   tempmatrix\value[#Yy] + (*self\value[9]  * *matrix\value[6])
  182.   tempmatrix\value[#Yy] + (*self\value[13] * *matrix\value[7])
  183.  
  184.   tempmatrix\value[#Yz] = (*self\value[2]  * *matrix\value[4])
  185.   tempmatrix\value[#Yz] + (*self\value[6]  * *matrix\value[5])
  186.   tempmatrix\value[#Yz] + (*self\value[10] * *matrix\value[6])
  187.   tempmatrix\value[#Yz] + (*self\value[14] * *matrix\value[7])
  188.  
  189.   tempmatrix\value[#Yw] = (*self\value[3]  * *matrix\value[4])
  190.   tempmatrix\value[#Yw] + (*self\value[7]  * *matrix\value[5])
  191.   tempmatrix\value[#Yw] + (*self\value[11] * *matrix\value[6])
  192.   tempmatrix\value[#Yw] + (*self\value[15] * *matrix\value[7])  
  193.  
  194.   tempmatrix\value[#Zx] = (*self\value[0]  * *matrix\value[8])
  195.   tempmatrix\value[#Zx] + (*self\value[4]  * *matrix\value[9])
  196.   tempmatrix\value[#Zx] + (*self\value[8]  * *matrix\value[10])
  197.   tempmatrix\value[#Zx] + (*self\value[12] * *matrix\value[11])
  198.  
  199.   tempmatrix\value[#Zy] = (*self\value[1]  * *matrix\value[8])
  200.   tempmatrix\value[#Zy] + (*self\value[5]  * *matrix\value[9])
  201.   tempmatrix\value[#Zy] + (*self\value[9]  * *matrix\value[10])
  202.   tempmatrix\value[#Zy] + (*self\value[13] * *matrix\value[11])
  203.  
  204.   tempmatrix\value[#Zz] = (*self\value[2]  * *matrix\value[8])
  205.   tempmatrix\value[#Zz] + (*self\value[6]  * *matrix\value[9])
  206.   tempmatrix\value[#Zz] + (*self\value[10] * *matrix\value[10])
  207.   tempmatrix\value[#Zz] + (*self\value[14] * *matrix\value[11])
  208.  
  209.   tempmatrix\value[#Zw] = (*self\value[3]  * *matrix\value[8])
  210.   tempmatrix\value[#Zw] + (*self\value[7]  * *matrix\value[9])
  211.   tempmatrix\value[#Zw] + (*self\value[11] * *matrix\value[10])
  212.   tempmatrix\value[#zw] + (*self\value[15] * *matrix\value[11])
  213.  
  214.   tempmatrix\value[#Tx] = (*self\value[0]  * *matrix\value[12])
  215.   tempmatrix\value[#Tx] + (*self\value[4]  * *matrix\value[13])
  216.   tempmatrix\value[#Tx] + (*self\value[8]  * *matrix\value[14])
  217.   tempmatrix\value[#Tx] + (*self\value[12] * *matrix\value[15])
  218.  
  219.   tempmatrix\value[#Ty] = (*self\value[1]  * *matrix\value[12])
  220.   tempmatrix\value[#Ty] + (*self\value[5]  * *matrix\value[13])
  221.   tempmatrix\value[#Ty] + (*self\value[9]  * *matrix\value[14])
  222.   tempmatrix\value[#Ty] + (*self\value[13] * *matrix\value[15])
  223.  
  224.   tempmatrix\value[#Tz] = (*self\value[2]  * *matrix\value[12])
  225.   tempmatrix\value[#Tz] + (*self\value[6]  * *matrix\value[13])
  226.   tempmatrix\value[#Tz] + (*self\value[10] * *matrix\value[14])
  227.   tempmatrix\value[#Tz] + (*self\value[14] * *matrix\value[15])
  228.  
  229.   tempmatrix\value[#Tw] = (*self\value[3]  * *matrix\value[12])
  230.   tempmatrix\value[#Tw] + (*self\value[7]  * *matrix\value[13])
  231.   tempmatrix\value[#Tw] + (*self\value[11] * *matrix\value[14])
  232.   tempmatrix\value[#Tw] + (*self\value[15] * *matrix\value[15])
  233.  
  234.   CopyMemory(@tempmatrix\value[0], @*self\value[0], #MATRIX_SIZEBYTE)
  235. EndProcedure
  236.  
  237. Procedure rotateX(*Self.MATRIXSTR, angledegree.f)
  238.   Define tempmatrix.MATRIXSTR
  239.   Define sine.f
  240.   Define cosine.f
  241.  
  242.   traceFunction("rotateX()")
  243.  
  244.   angledegree = Radian(angledegree)
  245.   sine = Sin(angledegree)
  246.   cosine = Cos(angledegree)
  247.  
  248.   identity(tempmatrix)
  249.  
  250.   With tempmatrix
  251.       \value[#Yy] = cosine
  252.       \value[#Yz] = -sine
  253.       \value[#Zy] = sine
  254.       \value[#Zz] = cosine
  255.     EndWith
  256.    
  257.     multiply(*self, tempmatrix)
  258. EndProcedure
  259.  
  260. Procedure rotateY(*Self.MATRIXSTR, angledegree.f)
  261.   Define tempmatrix.MATRIXSTR
  262.   Define sine.f
  263.   Define cosine.f
  264.  
  265.   traceFunction("rotateY()")
  266.  
  267.   angledegree = Radian(angledegree)
  268.   sine = Sin(angledegree)
  269.   cosine = Cos(angledegree)
  270.  
  271.   identity(tempmatrix)
  272.  
  273.   With tempmatrix
  274.       \value[#Xx] = cosine
  275.       \value[#Zx] = sine
  276.       \value[#Xz] = -sine
  277.       \value[#Zz] = cosine
  278.     EndWith
  279.    
  280.     multiply(*self, tempmatrix)
  281. EndProcedure
  282.  
  283. Procedure rotateZ(*Self.MATRIXSTR, angledegree.f)
  284.   Define tempmatrix.MATRIXSTR
  285.   Define sine.f
  286.   Define cosine.f
  287.  
  288.   traceFunction("rotateZ()")
  289.  
  290.   angledegree = Radian(angledegree)
  291.   sine = Sin(angledegree)
  292.   cosine = Cos(angledegree)
  293.  
  294.   identity(tempmatrix)
  295.  
  296.   With tempmatrix
  297.       \value[#Xx] = cosine
  298.       \value[#Xy] = -sine
  299.       \value[#Yx] = sine
  300.       \value[#Yy] = cosine
  301.     EndWith
  302.    
  303.     multiply(*self, tempmatrix)
  304. EndProcedure
  305.  
  306. Procedure translate(*Self.MATRIXSTR, x.f, y.f, z.f)
  307.   Define tempmatrix.MATRIXSTR
  308.  
  309.   traceFunction("translate()")
  310.  
  311.   identity(tempmatrix)
  312.  
  313.   With tempmatrix
  314.       \value[#Tx] = x
  315.       \value[#Ty] = y
  316.       \value[#Tz] = z
  317.     EndWith
  318.  
  319.     multiply(*self, tempmatrix)
  320. EndProcedure
  321.  
  322. Procedure perspective(*Self.MATRIXSTR, angle.f, near.f, far.f, aspect.f)
  323.   Define y_scale.f
  324.   Define x_scale.f
  325.   Define frustum_length.f
  326.  
  327.   traceFunction("perspective()")
  328.  
  329.   y_scale = 1.0/Tan(Radian(angle/2))
  330.   x_scale = y_scale/aspect
  331.   frustum_length = (far-near)
  332.  
  333.   With *self
  334.     \value[#Xx] = x_scale
  335.     \value[#Yy] = y_scale
  336.     \value[#Zz] = -( (near+far)/frustum_length )
  337.     \value[#Zw] = -1
  338.     \value[#Tz] = -( (2*near*far)/frustum_length )
  339.    
  340.     \value[#Xy] = 0
  341.     \value[#Xz] = 0
  342.     \value[#Xw] = 0
  343.     \value[#Yx] = 0
  344.     \value[#Yz] = 0
  345.     \value[#Yw] = 0
  346.     \value[#Zx] = 0
  347.     \value[#Zy] = 0
  348.     \value[#Tx] = 0
  349.     \value[#Ty] = 0
  350.     \value[#Tw] = 0
  351.   EndWith
  352. EndProcedure
  353.  
  354. Procedure orthogonal(*Self.MATRIXSTR, left.f, right.f, bottom.f, top.f, near.f, far.f)
  355.   traceFunction("orthogonal()")
  356.  
  357.   With *Self
  358.     \value[#Xx] = 2/(right-left)
  359.     \value[#Yy] = 2/(top-bottom)
  360.     \value[#Zz] = -2/(far-near)
  361.     \value[#Tx] = -( (right+left)/(right-left) )
  362.     \value[#Ty] = -( (top+bottom)/(top-bottom) )
  363.     \value[#Tz] = -( (far+near)/(far-near) )
  364.     \value[#Tw] = 1
  365.    
  366.     \value[#Xy] = 0
  367.     \value[#Xz] = 0
  368.     \value[#Xw] = 0
  369.     \value[#Yx] = 0
  370.     \value[#Yz] = 0
  371.     \value[#Yw] = 0
  372.     \value[#Zx] = 0
  373.     \value[#Zy] = 0
  374.   EndWith
  375. EndProcedure
  376.  
  377. Procedure lookAt(*Self.MATRIXSTR, eyeX.f, eyeY.f, eyeZ.f, centerX.f, centerY.f, centerZ.f, upX.f, upY.f, upZ.f)
  378.   Dim axe.f(2)
  379.   Dim regard.f(2)
  380.   Dim normal.f(2)
  381.   Dim newaxe.f(2)
  382.   Define tempmatrix.MATRIXSTR
  383.  
  384.   traceFunction("lookAt()")
  385.  
  386.   axe(0) = upX
  387.   axe(1) = upY
  388.   axe(2) = upZ
  389.   regard(0) = centerX-eyeX
  390.   regard(1) = centerY-eyeY
  391.   regard(2) = centerZ-eyeZ
  392.  
  393.   crossProduct( regard(), axe(), normal() )
  394.   crossProduct( normal(), regard(), newaxe() )
  395.  
  396.   normalize( normal() )
  397.   normalize( newaxe() )
  398.   normalize( regard() )
  399.  
  400.   With tempmatrix
  401.     \value[#Xx] = normal(0)
  402.     \value[#Xy] = newaxe(0)
  403.     \value[#Xz] = -regard(0)
  404.     \value[#Yx] = normal(1)
  405.     \value[#Yy] = newaxe(1)
  406.     \value[#Yz] = -regard(1)
  407.     \value[#Zx] = normal(2)
  408.     \value[#Zy] = newaxe(2)
  409.     \value[#Zz] = -regard(2)
  410.     \value[#Tw] = 1.0
  411.   EndWith
  412.  
  413.   multiply(*self, tempmatrix)
  414.   translate(*self, -eyeX, -eyeY, -eyeZ)
  415. EndProcedure
  416.  
  417. Procedure push(*Self.MATRIXSTR)
  418.   Define *tempstr.PARENTSTR = AllocateMemory( SizeOf(PARENTSTR) )
  419.  
  420.   traceFunction("push()")
  421.   CopyMemory(@*Self\value[0], @*tempstr\value[0], #MATRIX_SIZEBYTE)
  422.  
  423.   If *Self\parent
  424.     *tempstr\parent = *Self\parent
  425.   EndIf
  426.  
  427.   *Self\parent = *tempstr
  428. EndProcedure
  429.  
  430. Procedure pop(*Self.MATRIXSTR)
  431.   Define *tempstr.PARENTSTR = *Self\parent
  432.  
  433.   traceFunction("pop()")
  434.  
  435.   If Not *Self\parent
  436.     Debug "No matrix to restore"
  437.     ProcedureReturn
  438.   EndIf
  439.  
  440.   CopyMemory(@*tempstr\value[0], @*Self\value[0], #MATRIX_SIZEBYTE)
  441.  
  442.   If *tempstr\parent
  443.     *Self\parent = *tempstr\parent
  444.   Else
  445.     *self\parent = #Null
  446.   EndIf
  447.  
  448.   FreeMemory(*tempstr)
  449. EndProcedure
  450.  
  451. Procedure destroy(*Self.MATRIXSTR)
  452.   traceFunction("destroy()")
  453.   FreeMemory(*self)
  454. EndProcedure
  455.  
  456. Procedure.i createMatrix(label.s)
  457.   Define *temp.MATRIXSTR
  458.  
  459.   traceFunction("createMatrix()")
  460.    
  461.   *temp.MATRIXSTR = AllocateMemory( SizeOf( MATRIXSTR ) )
  462.   *temp\VTable = ?VTable
  463.   *temp\label = label
  464.   ProcedureReturn *temp
  465. EndProcedure
  466.  
  467. DataSection
  468.   VTable:
  469.   Data.l @debugValues()
  470.   Data.l @getAddress()
  471.   Data.l @identity()
  472.   Data.l @multiply()
  473.   Data.l @rotateX()
  474.   Data.l @rotateY()
  475.   Data.l @rotateZ()
  476.   Data.l @translate()
  477.   Data.l @perspective()
  478.   Data.l @orthogonal()
  479.   Data.l @lookAt()
  480.   Data.l @push()
  481.   Data.l @pop()
  482.   Data.l @destroy()
  483.  
  484.   MatrixIdentity:
  485.   Data.f 1, 0, 0, 0
  486.   Data.f 0, 1, 0, 0
  487.   Data.f 0, 0, 1, 0
  488.   Data.f 0, 0, 0, 1
  489. EndDataSection
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement