Advertisement
Guest User

Untitled

a guest
Oct 5th, 2015
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.52 KB | None | 0 0
  1. XIncludeFile "Vector2f.pbi"
  2. ;//////////////////////////////////////////////////////////////////////////////
  3. ;//
  4. ;//////////////////////////////////////////////////////////////////////////////
  5. Structure sMatrix
  6. mData.f[16]
  7. EndStructure
  8.  
  9. ;//////////////////////////////////////////////////////////////////////////////
  10. ;//
  11. ;//////////////////////////////////////////////////////////////////////////////
  12. Macro transform(matrix,a00,a01,a02,a10,a11,a12,a20,a21,a22)
  13. matrix\mData[0] = a00 : matrix\mData[4] = a01 : matrix\mData[8] = 0 : matrix\mData[12] = a02
  14. matrix\mData[1] = a10 : matrix\mData[5] = a11 : matrix\mData[9] = 0 : matrix\mData[13] = a12
  15. matrix\mData[2] = 0 : matrix\mData[6] = 0 : matrix\mData[10] = 1 : matrix\mData[14] = 0
  16. matrix\mData[3] = a20 : matrix\mData[7] = a21 : matrix\mData[11] = 0 : matrix\mData[15] = a22
  17. EndMacro
  18.  
  19. ;//////////////////////////////////////////////////////////////////////////////
  20. ;//
  21. ;//////////////////////////////////////////////////////////////////////////////
  22. ProcedureDLL createMatrix()
  23. *m.sMatrix = AllocateMemory(SizeOf(sMatrix))
  24. If *m
  25. *m\mData[0] = 1 : *m\mData[4] = 0 : *m\mData[8] = 0 : *m\mData[12] = 0
  26. *m\mData[1] = 0 : *m\mData[5] = 1 : *m\mData[9] = 0 : *m\mData[13] = 0
  27. *m\mData[2] = 0 : *m\mData[6] = 0 : *m\mData[10] = 1 : *m\mData[14] = 0
  28. *m\mData[3] = 0 : *m\mData[7] = 0 : *m\mData[11] = 0 : *m\mData[15] = 1
  29. ProcedureReturn *m
  30. EndIf
  31. EndProcedure
  32.  
  33. ;//////////////////////////////////////////////////////////////////////////////
  34. ;//
  35. ;//////////////////////////////////////////////////////////////////////////////
  36. ProcedureDLL deleteMatrix(*m.sMatrix)
  37. If *m
  38. For i = 0 To 15
  39. *m\mData[i] = #Null
  40. Next
  41. FreeMemory(*m)
  42. EndIf
  43. EndProcedure
  44.  
  45. ;//////////////////////////////////////////////////////////////////////////////
  46. ;//
  47. ;//////////////////////////////////////////////////////////////////////////////
  48. ProcedureDLL identityMatrix(*m.sMatrix)
  49. If *m
  50. *m\mData[0] = 1 : *m\mData[4] = 0 : *m\mData[8] = 0 : *m\mData[12] = 0
  51. *m\mData[1] = 0 : *m\mData[5] = 1 : *m\mData[9] = 0 : *m\mData[13] = 0
  52. *m\mData[2] = 0 : *m\mData[6] = 0 : *m\mData[10] = 1 : *m\mData[14] = 0
  53. *m\mData[3] = 0 : *m\mData[7] = 0 : *m\mData[11] = 0 : *m\mData[15] = 1
  54. EndIf
  55. EndProcedure
  56.  
  57. ;//////////////////////////////////////////////////////////////////////////////
  58. ;//
  59. ;//////////////////////////////////////////////////////////////////////////////
  60. ProcedureDLL.i getMatrix(*m.sMatrix)
  61. ProcedureReturn @*m\mData[0]
  62. EndProcedure
  63.  
  64. ;//////////////////////////////////////////////////////////////////////////////
  65. ;//
  66. ;//////////////////////////////////////////////////////////////////////////////
  67. ProcedureDLL.i combineMatrix(*result.sMatrix, *a.sMatrix, *b.sMatrix)
  68. Protected.f a00,a01,a02,a10,a11,a12,a20,a21,a22
  69. a00 = *a\mData[0] * *b\mData[0] + *a\mData[4] * *b\mData[1] + *a\mData[12] * *b\mData[3]
  70. a01 = *a\mData[0] * *b\mData[4] + *a\mData[4] * *b\mData[5] + *a\mData[12] * *b\mData[7]
  71. a02 = *a\mData[0] * *b\mData[12] + *a\mData[4] * *b\mData[13] + *a\mData[12] * *b\mData[15]
  72. a10 = *a\mData[1] * *b\mData[0] + *a\mData[5] * *b\mData[1] + *a\mData[13] * *b\mData[3]
  73. a11 = *a\mData[1] * *b\mData[4] + *a\mData[5] * *b\mData[5] + *a\mData[13] * *b\mData[7]
  74. a12 = *a\mData[1] * *b\mData[12] + *a\mData[5] * *b\mData[13] + *a\mData[13] * *b\mData[15]
  75. a20 = *a\mData[3] * *b\mData[0] + *a\mData[7] * *b\mData[1] + *a\mData[15] * *b\mData[3]
  76. a21 = *a\mData[3] * *b\mData[4] + *a\mData[7] * *b\mData[5] + *a\mData[15] * *b\mData[7]
  77. a22 = *a\mData[3] * *b\mData[12] + *a\mData[7] * *b\mData[13] + *a\mData[15] * *b\mData[15]
  78. transform(*result,a00,a01,a02,a10,a11,a12,a20,a21,a22)
  79. EndProcedure
  80.  
  81. ;//////////////////////////////////////////////////////////////////////////////
  82. ;//
  83. ;//////////////////////////////////////////////////////////////////////////////
  84. ProcedureDLL translateMatrix(*m.sMatrix,x.f, y.f)
  85. *cpy.sMatrix = createMatrix()
  86. CopyStructure(*m,*cpy,sMatrix)
  87. transform(*m,1,0,x,0,1,y,0,0,1)
  88. combineMatrix(*m,*cpy,*m)
  89. deleteMatrix(*cpy)
  90. EndProcedure
  91.  
  92. ;//////////////////////////////////////////////////////////////////////////////
  93. ;//
  94. ;//////////////////////////////////////////////////////////////////////////////
  95. ProcedureDLL rotateMatrix(*m.sMatrix, angle.f)
  96. Protected rad.f = angle * #PI / 180
  97. Protected cos.f = Cos(rad)
  98. Protected sin.f = Sin(rad)
  99. *cpy.sMatrix = createMatrix()
  100. CopyStructure(*m,*cpy,sMatrix)
  101. transform(*m,cos,-sin,0,sin,cos,0,0,0,1)
  102. combineMatrix(*m,*cpy,*m)
  103. deleteMatrix(*cpy)
  104. EndProcedure
  105.  
  106. ;//////////////////////////////////////////////////////////////////////////////
  107. ;//
  108. ;//////////////////////////////////////////////////////////////////////////////
  109. ProcedureDLL rotateByCenterMatrix(*m.sMatrix, angle.f, x.f, y.f)
  110. Protected rad.f = angle * #PI / 180
  111. Protected cos.f = Cos(rad)
  112. Protected sin.f = Sin(rad)
  113. *cpy.sMatrix = createMatrix()
  114. CopyStructure(*m,*cpy,sMatrix)
  115. transform(*m, cos,-sin,x * (1-cos) + y * sin,sin,cos,y * (1-cos) - x * sin,0,0,1)
  116. combineMatrix(*m,*cpy,*m)
  117. deleteMatrix(*cpy)
  118. EndProcedure
  119.  
  120. ;//////////////////////////////////////////////////////////////////////////////
  121. ;//
  122. ;//////////////////////////////////////////////////////////////////////////////
  123. ProcedureDLL scaleMatrix(*m.sMatrix,x.f, y.f)
  124. *cpy.sMatrix = createMatrix()
  125. CopyStructure(*m,*cpy,sMatrix)
  126. transform(*m, x,0,0,0,y,0,0,0,1)
  127. combineMatrix(*m,*cpy,*m)
  128. deleteMatrix(*cpy)
  129. EndProcedure
  130.  
  131. ;//////////////////////////////////////////////////////////////////////////////
  132. ;//
  133. ;//////////////////////////////////////////////////////////////////////////////
  134. ProcedureDLL scaleByCenterMatrix(*m.sMatrix,x.f, y.f, cx.f, cy.f)
  135. *cpy.sMatrix = createMatrix()
  136. CopyStructure(*m,*cpy,sMatrix)
  137. transform(*m,x,0,cx * (1-x),0,y,cy * (1-y),0,0,1)
  138. combineMatrix(*m,*cpy,*m)
  139. deleteMatrix(*cpy)
  140. EndProcedure
  141.  
  142. ;//////////////////////////////////////////////////////////////////////////////
  143. ;//
  144. ;//////////////////////////////////////////////////////////////////////////////
  145. ProcedureDLL.i transformPointMatrix(*m.sMatrix, x.f, y.f)
  146. If *m
  147. Protected _x.f = *m\mData[0] * x + *m\mData[4] * y + *m\mData[12]
  148. Protected _y.f = *m\mData[1] * x + *m\mData[5] * y + *m\mData[13]
  149. ProcedureReturn createVector2f(_x, _y)
  150. EndIf
  151. EndProcedure
  152.  
  153. ;//////////////////////////////////////////////////////////////////////////////
  154. ;//
  155. ;//////////////////////////////////////////////////////////////////////////////
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement