# HG changeset patch # User Emmanuel Gil Peyrot # Date 1387386940 -3600 # Node ID 7f016dfbdfb1381151bbe86febb57663ea369742 # Parent 6e3b3d5d469127ff8d5cc3750daef634ef9323dc Make vector a struct, allocate it directly on the stack, and thus pass it by copy, which is much less expensive than a python allocation. diff --git a/pytouhou/utils/maths.pxd b/pytouhou/utils/maths.pxd --- a/pytouhou/utils/maths.pxd +++ b/pytouhou/utils/maths.pxd @@ -1,5 +1,5 @@ from .matrix cimport Matrix -cdef Matrix *ortho_2d(float left, float right, float bottom, float top) -cdef Matrix *perspective(float fovy, float aspect, float zNear, float zFar) +cdef Matrix *ortho_2d(float left, float right, float bottom, float top) nogil +cdef Matrix *perspective(float fovy, float aspect, float zNear, float zFar) nogil cdef Matrix *setup_camera(float dx, float dy, float dz) diff --git a/pytouhou/utils/maths.pyx b/pytouhou/utils/maths.pyx --- a/pytouhou/utils/maths.pyx +++ b/pytouhou/utils/maths.pyx @@ -13,16 +13,18 @@ ## from libc.math cimport tan, M_PI as pi +cimport cython from .matrix cimport new_matrix, new_identity -from .vector cimport Vector, normalize, cross, dot +from .vector cimport Vector, sub, cross, dot, normalize cdef double radians(double degrees) nogil: return degrees * pi / 180 -cdef Matrix *ortho_2d(float left, float right, float bottom, float top): +@cython.cdivision(True) +cdef Matrix *ortho_2d(float left, float right, float bottom, float top) nogil: mat = new_identity() data = mat data[4*0+0] = 2 / (right - left) @@ -36,7 +38,7 @@ cdef Matrix *ortho_2d(float left, float cdef Matrix *look_at(Vector eye, Vector center, Vector up): cdef Matrix mat - f = normalize(center.sub(eye)) + f = normalize(sub(center, eye)) u = normalize(up) s = normalize(cross(f, u)) u = cross(s, f) @@ -49,7 +51,8 @@ cdef Matrix *look_at(Vector eye, Vector return new_matrix(&mat) -cdef Matrix *perspective(float fovy, float aspect, float z_near, float z_far): +@cython.cdivision(True) +cdef Matrix *perspective(float fovy, float aspect, float z_near, float z_far) nogil: top = tan(radians(fovy / 2)) * z_near bottom = -top left = -top * aspect diff --git a/pytouhou/utils/vector.pxd b/pytouhou/utils/vector.pxd --- a/pytouhou/utils/vector.pxd +++ b/pytouhou/utils/vector.pxd @@ -1,8 +1,7 @@ -cdef class Vector: - cdef float x, y, z +cdef struct Vector: + float x, y, z - cdef Vector sub(self, Vector other) - +cdef Vector sub(Vector vec1, Vector vec2) cdef Vector cross(Vector vec1, Vector vec2) -cdef float dot(Vector vec1, Vector vec2) +cdef float dot(Vector vec1, Vector vec2) nogil cdef Vector normalize(Vector vec) diff --git a/pytouhou/utils/vector.pyx b/pytouhou/utils/vector.pyx --- a/pytouhou/utils/vector.pyx +++ b/pytouhou/utils/vector.pyx @@ -13,23 +13,13 @@ ## from libc.math cimport sqrt - - -cdef class Vector: - def __init__(self, float x, float y, float z): - self.x = x - self.y = y - self.z = z +cimport cython - cdef Vector sub(self, Vector other): - cdef float x, y, z - - x = self.x - other.x - y = self.y - other.y - z = self.z - other.z - - return Vector(x, y, z) +cdef Vector sub(Vector vec1, Vector vec2): + return Vector(vec1.x - vec2.x, + vec1.y - vec2.y, + vec1.z - vec2.z) cdef Vector cross(Vector vec1, Vector vec2): @@ -38,10 +28,11 @@ cdef Vector cross(Vector vec1, Vector ve vec1.x * vec2.y - vec2.x * vec1.y) -cdef float dot(Vector vec1, Vector vec2): +cdef float dot(Vector vec1, Vector vec2) nogil: return vec1.x * vec2.x + vec2.y * vec1.y + vec1.z * vec2.z +@cython.cdivision(True) cdef Vector normalize(Vector vec): cdef float normal