# -*- indent-tabs-mode: t -*- # Soya 3D # Copyright (C) 2004 Jean-Baptiste LAMY -- jiba@tuxfamily.org # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA cdef float _SPRITE_MATRIX[16] _SPRITE_MATRIX[0] = _SPRITE_MATRIX[5] = _SPRITE_MATRIX[10] = _SPRITE_MATRIX[15] = 1.0 _SPRITE_MATRIX[1] = _SPRITE_MATRIX[2] = _SPRITE_MATRIX[3] = _SPRITE_MATRIX[4] = _SPRITE_MATRIX[6] = _SPRITE_MATRIX[7] = _SPRITE_MATRIX[8] = _SPRITE_MATRIX[9] = _SPRITE_MATRIX[11] = _SPRITE_MATRIX[12] = _SPRITE_MATRIX[13] = _SPRITE_MATRIX[14] = 0.0 cdef float _CYLINDER_SPRITE_MATRIX[16] _CYLINDER_SPRITE_MATRIX[0] = _CYLINDER_SPRITE_MATRIX[5] = _CYLINDER_SPRITE_MATRIX[10] = _CYLINDER_SPRITE_MATRIX[15] = 1.0 _CYLINDER_SPRITE_MATRIX[1] = _CYLINDER_SPRITE_MATRIX[2] = _CYLINDER_SPRITE_MATRIX[3] = _CYLINDER_SPRITE_MATRIX[4] = _CYLINDER_SPRITE_MATRIX[6] = _CYLINDER_SPRITE_MATRIX[7] = _CYLINDER_SPRITE_MATRIX[8] = _CYLINDER_SPRITE_MATRIX[9] = _CYLINDER_SPRITE_MATRIX[11] = _CYLINDER_SPRITE_MATRIX[12] = _CYLINDER_SPRITE_MATRIX[13] = _CYLINDER_SPRITE_MATRIX[14] = 0.0 cdef class _Sprite(CoordSyst): #cdef float _width, _height #cdef float _color[4] #cdef _Material _material property width: def __get__(self): return self._width def __set__(self, float x): self._width = x property height: def __get__(self): return self._height def __set__(self, float x): self._height = x property color: def __get__(self): return self._color[0], self._color[1], self._color[2], self._color[3] def __set__(self, x): self._color[0], self._color[1], self._color[2], self._color[3] = x property material: def __get__(self): return self._material def __set__(self, _Material x not None): self._material = x property lit: def __get__(self): return not(self._option & SPRITE_NEVER_LIT) def __set__(self, int x): if x: self._option = self._option & ~SPRITE_NEVER_LIT else: self._option = self._option | SPRITE_NEVER_LIT def __init__(self, _World parent = None, _Material material = None): CoordSyst.__init__(self, parent) self._material = material or _DEFAULT_MATERIAL self._color[0] = self._color[1] = self._color[2] = self._color[3] = 1.0 self._width = self._height = 0.5 cdef __getcstate__(self): #return struct.pack(" (1.0 / sqrt(x * x + y * y)) _CYLINDER_SPRITE_MATRIX[5] = -x * f _CYLINDER_SPRITE_MATRIX[4] = y * f _CYLINDER_SPRITE_MATRIX[0] = _CYLINDER_SPRITE_MATRIX[5] * _CYLINDER_SPRITE_MATRIX[10] - _CYLINDER_SPRITE_MATRIX[6] * _CYLINDER_SPRITE_MATRIX[9] _CYLINDER_SPRITE_MATRIX[1] = -_CYLINDER_SPRITE_MATRIX[4] * _CYLINDER_SPRITE_MATRIX[10] + _CYLINDER_SPRITE_MATRIX[6] * _CYLINDER_SPRITE_MATRIX[8] _CYLINDER_SPRITE_MATRIX[2] = _CYLINDER_SPRITE_MATRIX[4] * _CYLINDER_SPRITE_MATRIX[ 9] - _CYLINDER_SPRITE_MATRIX[5] * _CYLINDER_SPRITE_MATRIX[8] # render self._material._activate() glLoadMatrixf(_CYLINDER_SPRITE_MATRIX) glDisable(GL_CULL_FACE) if self._option & SPRITE_NEVER_LIT: glDisable(GL_LIGHTING) else: glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE) glNormal3f(1.0, 0.0, 0.0) glColor4fv(self._color) glBegin(GL_QUADS) glTexCoord2f(0.0, 0.0); glVertex3f(0.0, - self._height, - self._width) glTexCoord2f(1.0, 0.0); glVertex3f(0.0, self._height, - self._width) glTexCoord2f(1.0, 1.0); glVertex3f(0.0, self._height, self._width) glTexCoord2f(0.0, 1.0); glVertex3f(0.0, - self._height, self._width) glEnd() glEnable(GL_CULL_FACE) if self._option & SPRITE_NEVER_LIT: glEnable(GL_LIGHTING) else: glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE) cdef class _Bonus(CoordSyst): #cdef float _angle #cdef float _color[4] #cdef _Material _material, _halo cdef __getcstate__(self): #return struct.pack("= 360.0: self._angle = self._angle - 360.0 multiply_matrix(self._render_matrix, coordsyst._render_matrix, self._matrix) self._frustum_id = -1 renderer._batch(renderer.alpha, self, self, NULL) cdef void _render(self, CoordSyst coordsyst): cdef float* m self._option = self._option & ~BONUS_BATCHED glDisable(GL_CULL_FACE) if self._option & SPRITE_NEVER_LIT: glDisable(GL_LIGHTING) else: glNormal3f(0.0, 0.0, -1.0) # draw halo #m = self._parent._render_matrix #_SPRITE_MATRIX[12] = m[12] + self._matrix[12] #_SPRITE_MATRIX[13] = m[13] + self._matrix[13] + 1.0 #_SPRITE_MATRIX[14] = m[14] + self._matrix[14] #glLoadMatrixf(_SPRITE_MATRIX) m = self._render_matrix _SPRITE_MATRIX[12] = m[12] _SPRITE_MATRIX[13] = m[13] + 1.0 _SPRITE_MATRIX[14] = m[14] glLoadMatrixf(_SPRITE_MATRIX) self._halo._activate() glColor4fv(self._color) glDisable(GL_LIGHTING) glBegin(GL_QUADS) glTexCoord2f(0.0, 1.0); glVertex3f(- 1.0, - 1.0, 0.0) glTexCoord2f(1.0, 1.0); glVertex3f(- 1.0, 1.0, 0.0) glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, 1.0, 0.0) glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, - 1.0, 0.0) glEnd() glEnable(GL_LIGHTING) # draw 2D square glRotatef(self._angle, 0.0, 1.0, 0.0) glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE) self._material._activate() glBegin(GL_QUADS) glTexCoord2f(0.0, 1.0); glVertex3f(- 0.5, -0.5, 0.0) glTexCoord2f(1.0, 1.0); glVertex3f( 0.5, -0.5, 0.0) glTexCoord2f(1.0, 0.0); glVertex3f( 0.5, 0.5, 0.0) glTexCoord2f(0.0, 0.0); glVertex3f(- 0.5, 0.5, 0.0) glEnd() glEnable(GL_CULL_FACE) glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE) if self._option & SPRITE_NEVER_LIT: glEnable(GL_LIGHTING)