Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- XIncludeFile "Vector2f.pbi"
- ;//////////////////////////////////////////////////////////////////////////////
- ;//
- ;//////////////////////////////////////////////////////////////////////////////
- Structure sMatrix
- mData.f[16]
- EndStructure
- ;//////////////////////////////////////////////////////////////////////////////
- ;//
- ;//////////////////////////////////////////////////////////////////////////////
- Macro transform(matrix,a00,a01,a02,a10,a11,a12,a20,a21,a22)
- matrix\mData[0] = a00 : matrix\mData[4] = a01 : matrix\mData[8] = 0 : matrix\mData[12] = a02
- matrix\mData[1] = a10 : matrix\mData[5] = a11 : matrix\mData[9] = 0 : matrix\mData[13] = a12
- matrix\mData[2] = 0 : matrix\mData[6] = 0 : matrix\mData[10] = 1 : matrix\mData[14] = 0
- matrix\mData[3] = a20 : matrix\mData[7] = a21 : matrix\mData[11] = 0 : matrix\mData[15] = a22
- EndMacro
- ;//////////////////////////////////////////////////////////////////////////////
- ;//
- ;//////////////////////////////////////////////////////////////////////////////
- ProcedureDLL createMatrix()
- *m.sMatrix = AllocateMemory(SizeOf(sMatrix))
- If *m
- *m\mData[0] = 1 : *m\mData[4] = 0 : *m\mData[8] = 0 : *m\mData[12] = 0
- *m\mData[1] = 0 : *m\mData[5] = 1 : *m\mData[9] = 0 : *m\mData[13] = 0
- *m\mData[2] = 0 : *m\mData[6] = 0 : *m\mData[10] = 1 : *m\mData[14] = 0
- *m\mData[3] = 0 : *m\mData[7] = 0 : *m\mData[11] = 0 : *m\mData[15] = 1
- ProcedureReturn *m
- EndIf
- EndProcedure
- ;//////////////////////////////////////////////////////////////////////////////
- ;//
- ;//////////////////////////////////////////////////////////////////////////////
- ProcedureDLL deleteMatrix(*m.sMatrix)
- If *m
- For i = 0 To 15
- *m\mData[i] = #Null
- Next
- FreeMemory(*m)
- EndIf
- EndProcedure
- ;//////////////////////////////////////////////////////////////////////////////
- ;//
- ;//////////////////////////////////////////////////////////////////////////////
- ProcedureDLL identityMatrix(*m.sMatrix)
- If *m
- *m\mData[0] = 1 : *m\mData[4] = 0 : *m\mData[8] = 0 : *m\mData[12] = 0
- *m\mData[1] = 0 : *m\mData[5] = 1 : *m\mData[9] = 0 : *m\mData[13] = 0
- *m\mData[2] = 0 : *m\mData[6] = 0 : *m\mData[10] = 1 : *m\mData[14] = 0
- *m\mData[3] = 0 : *m\mData[7] = 0 : *m\mData[11] = 0 : *m\mData[15] = 1
- EndIf
- EndProcedure
- ;//////////////////////////////////////////////////////////////////////////////
- ;//
- ;//////////////////////////////////////////////////////////////////////////////
- ProcedureDLL.i getMatrix(*m.sMatrix)
- ProcedureReturn @*m\mData[0]
- EndProcedure
- ;//////////////////////////////////////////////////////////////////////////////
- ;//
- ;//////////////////////////////////////////////////////////////////////////////
- ProcedureDLL.i combineMatrix(*result.sMatrix, *a.sMatrix, *b.sMatrix)
- Protected.f a00,a01,a02,a10,a11,a12,a20,a21,a22
- a00 = *a\mData[0] * *b\mData[0] + *a\mData[4] * *b\mData[1] + *a\mData[12] * *b\mData[3]
- a01 = *a\mData[0] * *b\mData[4] + *a\mData[4] * *b\mData[5] + *a\mData[12] * *b\mData[7]
- a02 = *a\mData[0] * *b\mData[12] + *a\mData[4] * *b\mData[13] + *a\mData[12] * *b\mData[15]
- a10 = *a\mData[1] * *b\mData[0] + *a\mData[5] * *b\mData[1] + *a\mData[13] * *b\mData[3]
- a11 = *a\mData[1] * *b\mData[4] + *a\mData[5] * *b\mData[5] + *a\mData[13] * *b\mData[7]
- a12 = *a\mData[1] * *b\mData[12] + *a\mData[5] * *b\mData[13] + *a\mData[13] * *b\mData[15]
- a20 = *a\mData[3] * *b\mData[0] + *a\mData[7] * *b\mData[1] + *a\mData[15] * *b\mData[3]
- a21 = *a\mData[3] * *b\mData[4] + *a\mData[7] * *b\mData[5] + *a\mData[15] * *b\mData[7]
- a22 = *a\mData[3] * *b\mData[12] + *a\mData[7] * *b\mData[13] + *a\mData[15] * *b\mData[15]
- transform(*result,a00,a01,a02,a10,a11,a12,a20,a21,a22)
- EndProcedure
- ;//////////////////////////////////////////////////////////////////////////////
- ;//
- ;//////////////////////////////////////////////////////////////////////////////
- ProcedureDLL translateMatrix(*m.sMatrix,x.f, y.f)
- *cpy.sMatrix = createMatrix()
- CopyStructure(*m,*cpy,sMatrix)
- transform(*m,1,0,x,0,1,y,0,0,1)
- combineMatrix(*m,*cpy,*m)
- deleteMatrix(*cpy)
- EndProcedure
- ;//////////////////////////////////////////////////////////////////////////////
- ;//
- ;//////////////////////////////////////////////////////////////////////////////
- ProcedureDLL rotateMatrix(*m.sMatrix, angle.f)
- Protected rad.f = angle * #PI / 180
- Protected cos.f = Cos(rad)
- Protected sin.f = Sin(rad)
- *cpy.sMatrix = createMatrix()
- CopyStructure(*m,*cpy,sMatrix)
- transform(*m,cos,-sin,0,sin,cos,0,0,0,1)
- combineMatrix(*m,*cpy,*m)
- deleteMatrix(*cpy)
- EndProcedure
- ;//////////////////////////////////////////////////////////////////////////////
- ;//
- ;//////////////////////////////////////////////////////////////////////////////
- ProcedureDLL rotateByCenterMatrix(*m.sMatrix, angle.f, x.f, y.f)
- Protected rad.f = angle * #PI / 180
- Protected cos.f = Cos(rad)
- Protected sin.f = Sin(rad)
- *cpy.sMatrix = createMatrix()
- CopyStructure(*m,*cpy,sMatrix)
- transform(*m, cos,-sin,x * (1-cos) + y * sin,sin,cos,y * (1-cos) - x * sin,0,0,1)
- combineMatrix(*m,*cpy,*m)
- deleteMatrix(*cpy)
- EndProcedure
- ;//////////////////////////////////////////////////////////////////////////////
- ;//
- ;//////////////////////////////////////////////////////////////////////////////
- ProcedureDLL scaleMatrix(*m.sMatrix,x.f, y.f)
- *cpy.sMatrix = createMatrix()
- CopyStructure(*m,*cpy,sMatrix)
- transform(*m, x,0,0,0,y,0,0,0,1)
- combineMatrix(*m,*cpy,*m)
- deleteMatrix(*cpy)
- EndProcedure
- ;//////////////////////////////////////////////////////////////////////////////
- ;//
- ;//////////////////////////////////////////////////////////////////////////////
- ProcedureDLL scaleByCenterMatrix(*m.sMatrix,x.f, y.f, cx.f, cy.f)
- *cpy.sMatrix = createMatrix()
- CopyStructure(*m,*cpy,sMatrix)
- transform(*m,x,0,cx * (1-x),0,y,cy * (1-y),0,0,1)
- combineMatrix(*m,*cpy,*m)
- deleteMatrix(*cpy)
- EndProcedure
- ;//////////////////////////////////////////////////////////////////////////////
- ;//
- ;//////////////////////////////////////////////////////////////////////////////
- ProcedureDLL.i transformPointMatrix(*m.sMatrix, x.f, y.f)
- If *m
- Protected _x.f = *m\mData[0] * x + *m\mData[4] * y + *m\mData[12]
- Protected _y.f = *m\mData[1] * x + *m\mData[5] * y + *m\mData[13]
- ProcedureReturn createVector2f(_x, _y)
- EndIf
- EndProcedure
- ;//////////////////////////////////////////////////////////////////////////////
- ;//
- ;//////////////////////////////////////////////////////////////////////////////
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement