source: src/models/Axis.pym @ 1335:88ced5c5ed8d

Revision 1335:88ced5c5ed8d, 10.8 KB checked in by David Czech <davidczech510@…>, 6 years ago (diff)

Ticket #963: Scale matrix and size definition

Line 
1# PySoy's models.Axis class
2#
3# Copyright (C) 2006,2007,2008 PySoy Group
4#
5#  This program is free software; you can redistribute it and/or modify
6#  it under the terms of the GNU Affero General Public License as published
7#  by the Free Software Foundation, either version 3 of the License, or
8#  (at your option) any later version.
9#
10#  This program is distributed in the hope that it will be useful,
11#  but WITHOUT ANY WARRANTY; without even the implied warranty of
12#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13#  GNU Affero General Public License for more details.
14#
15#  You should have received a copy of the GNU Affero General Public License
16#  along with this program; if not, see http://www.gnu.org/licenses
17#
18# $Id: Axis.pym 1383 2008-12-01 05:44:55Z DavidCzech $
19
20cdef class Axis (Model) :
21  '''soy.models.Axis
22
23    This :class:`~soy.model.Model` renders a "XYZ axis" oriented to each
24    body it's attached to.  This is useful for debugging.
25  '''
26  def __cinit__(self, size=None,*args, **kw):
27    if size == None:   
28      self._size = 0;
29    else:
30      #assert isinstance(size,int)
31      self._size = size;
32
33  property size :
34    def __get__(self):
35      return self._size
36    def __set__(self, value):
37      self._size = value
38   
39  ############################################################################
40  #
41  # WindowLoop Functions
42  #
43
44  cdef void _render(self, soy.bodies.Body _body) :
45    cdef VertPC      _vert[20]     # contains vertex position and color data
46    cdef Line        _elmt[20]     # contains indices to verts to render lines
47    cdef gl.GLfloat  _mtx[16]
48    #
49    ######################################
50    #
51    # get model's matrix
52    #
53    _mtx[0]  = _body._rotation[0] * self._size
54    _mtx[1]  = _body._rotation[4]
55    _mtx[2]  = _body._rotation[8]
56    _mtx[3]  = 0.0 
57    _mtx[4]  = _body._rotation[1]
58    _mtx[5]  = _body._rotation[5] * self._size
59    _mtx[6]  = _body._rotation[9]
60    _mtx[7]  = 0.0 
61    _mtx[8]  = _body._rotation[2]
62    _mtx[9]  = _body._rotation[6]
63    _mtx[10] = _body._rotation[10] * self._size
64    _mtx[11] = 0.0
65    _mtx[12] = _body._position[0]
66    _mtx[13] = _body._position[1]
67    _mtx[14] = _body._position[2]
68    _mtx[15] = 1#-self._size + 2
69    #
70    ######################################
71    #
72    # save Camera matix before transforming to the Axis' matrix
73    #
74    gl.glPushMatrix()
75    gl.glMultMatrixf(_mtx)
76    #gl.glScalef(self._size,self._size,self._size)
77    #
78    ######################################
79    #
80    # Test if we've already setup the axis VBO
81    #
82    if self._vertBuffer :
83      #
84      # Since we already setup the buffers during the first _render, now we
85      # just need to re-bind them to render again
86      #
87      gl.glBindBufferARB(gl.GL_ARRAY_BUFFER_ARB,         self._vertBuffer)
88      gl.glBindBufferARB(gl.GL_ELEMENT_ARRAY_BUFFER_ARB, self._elmtBuffer)
89      #
90    else:
91      #
92      # This is the first render pass, so we need to setup the VBO
93      #
94      # First we'll populate _vert
95      #
96      # X Axis.
97      _vert[0].px = 0.00          # \  Vertex 0
98      _vert[0].py = 0.00          #  } (0.0, 0.0, 0.0)
99      _vert[0].pz = 0.00          # /
100      _vert[0].cr = 1.00          # \
101      _vert[0].cg = 0.00          #  } Red
102      _vert[0].cb = 0.00          # /___________________________
103      _vert[1].px = 1.00          # \  Vertex 1
104      _vert[1].py = 0.00          #  } (1.0, 0.0, 0.0)
105      _vert[1].pz = 0.00          # /
106      _vert[1].cr = 1.00          # \
107      _vert[1].cg = 0.00          #  } Red
108      _vert[1].cb = 0.00          # /___________________________
109
110      _vert[2].px = 1.00          # \  Vertex 2
111      _vert[2].py = 0.30          #  } (1.0, 0.3, 0.0)
112      _vert[2].pz = 0.00          # /
113      _vert[2].cr = 1.00          # \
114      _vert[2].cg = 0.00          #  } Red
115      _vert[2].cb = 0.00          # /___________________________
116      _vert[3].px = 1.30          # \  Vertex 3
117      _vert[3].py = 0.00          #  } (1.3, 0.0, 0.0)
118      _vert[3].pz = 0.00          # /
119      _vert[3].cr = 1.00          # \
120      _vert[3].cg = 0.00          #  } Red
121      _vert[3].cb = 0.00          # /___________________________
122
123      _vert[4].px = 1.00          # \  Vertex 4
124      _vert[4].py = -.30          #  } (1.0, -0.3, 0.0)
125      _vert[4].pz = 0.00          # /
126      _vert[4].cr = 1.00          # \
127      _vert[4].cg = 0.00          #  } Red
128      _vert[4].cb = 0.00          # /___________________________
129
130      # Y Axis
131      _vert[5]= _vert[0]          # Vertex 5 is the same as vertex 0
132      _vert[5].cr = 0.0           # Except its not Red.
133      _vert[5].cg = 1.0           # Its green.
134
135      _vert[6].px = 0.00          # \  Vertex 6
136      _vert[6].py = 1.00          #  } (0.0, 1.0, 0.0)
137      _vert[6].pz = 0.00          # /
138      _vert[6].cr = 0.00          # \
139      _vert[6].cg = 1.00          #  } Red
140      _vert[6].cb = 0.00          # /___________________________
141      _vert[7].px = 0.30          # \  Vertex 7
142      _vert[7].py = 1.00          #  } (0.3, 1.0, 0.0)
143      _vert[7].pz = 0.00          # /
144      _vert[7].cr = 0.00          # \
145      _vert[7].cg = 1.00          #  } Red
146      _vert[7].cb = 0.00          # /___________________________
147
148      _vert[8].px = 0.00          # \  Vertex 8
149      _vert[8].py = 1.30          #  } (0.0, 1.3, 0.0)
150      _vert[8].pz = 0.00          # /
151      _vert[8].cr = 0.00          # \
152      _vert[8].cg = 1.00          #  } Red
153      _vert[8].cb = 0.00          # /___________________________
154      _vert[9].px = -.30          # \  Vertex 9
155      _vert[9].py = 1.00          #  } (-0.3, 1.0, 0.0)
156      _vert[9].pz = 0.00          # /
157      _vert[9].cr = 0.00          # \
158      _vert[9].cg = 1.00          #  } Red
159      _vert[9].cb = 0.00          # /___________________________
160
161      # Z Axis
162      _vert[10] = _vert[0]
163      _vert[10].cr = 0.00          # \
164      _vert[10].cb = 1.00          # /___________________________
165
166      _vert[11].px = 0.00          # \  Vertex 11
167      _vert[11].py = 0.00          #  } (0.0, 1.3, 0.0)
168      _vert[11].pz = 1.00          # /
169      _vert[11].cr = 0.00          # \
170      _vert[11].cg = 0.00          #  } Red
171      _vert[11].cb = 1.00          # /___________________________
172
173      _vert[12].px = 0.30          # \  Vertex 12
174      _vert[12].py = 0.00          #  } (-0.3, 1.0, 0.0)
175      _vert[12].pz = 1.00          # /
176      _vert[12].cr = 0.00          # \
177      _vert[12].cg = 0.00          #  } Red
178      _vert[12].cb = 1.00          # /___________________________
179
180      _vert[13].px = 0.00          # \  Vertex 13
181      _vert[13].py = 0.00          #  } (0.0, 1.3, 0.0)
182      _vert[13].pz = 1.30          # /
183      _vert[13].cr = 0.00          # \
184      _vert[13].cg = 0.00          #  } Red
185      _vert[13].cb = 1.00          # /___________________________
186      _vert[14].px = -.30          # \  Vertex 14
187      _vert[14].py = 0.00          #  } (-0.3, 1.0, 0.0)
188      _vert[14].pz = 1.00          # /
189      _vert[14].cr = 0.00          # \
190      _vert[14].cg = 0.00          #  } Red
191      _vert[14].cb = 1.00          # /___________________________
192
193      # TODO optional tags. I left them out because they're not all that useful
194      # and take up another 15+ verticies.. maybe when we can define verticies more easily.
195     
196
197      #
198      # Next populate _elmt
199      #
200      _elmt[0].a = 0              # Line 0: 0-1
201      _elmt[0].b = 1              # ____________________________
202
203      _elmt[1].a = 2              # Line 1: 2-4
204      _elmt[1].b = 4              # ____________________________
205
206      _elmt[2].a = 2              # Line 2: 2-3
207      _elmt[2].b = 3              # ____________________________
208
209      _elmt[3].a = 3              # Line 3: 3-4
210      _elmt[3].b = 4              # ____________________________
211
212      _elmt[4].a = 5              # Line 4: 5-6
213      _elmt[4].b = 6              # ____________________________
214
215      _elmt[5].a = 7              # Line 5: 7-9
216      _elmt[5].b = 9              # ____________________________
217
218      _elmt[6].a = 8              # Line 6: 8-9
219      _elmt[6].b = 9              # ____________________________
220
221      _elmt[7].a = 8              # Line 7: 8-7
222      _elmt[7].b = 7              # ____________________________
223
224      _elmt[8].a = 10             # Line 8: 10-11
225      _elmt[8].b = 11             # ____________________________
226
227      _elmt[9].a = 14             # Line 9: 14-12
228      _elmt[9].b = 12             # ____________________________
229
230      _elmt[10].a = 13            # Line 10: 13-12
231      _elmt[10].b = 12            # ____________________________
232
233      _elmt[11].a = 13            # Line 11: 13-14
234      _elmt[11].b = 14            # ____________________________
235
236      #
237      # Create new vertex buffer and send _vert
238      #
239      gl.glGenBuffersARB(1, &self._vertBuffer)
240      gl.glBindBufferARB(gl.GL_ARRAY_BUFFER_ARB, self._vertBuffer)
241      gl.glBufferDataARB(gl.GL_ARRAY_BUFFER_ARB, sizeof(_vert), _vert,
242                         gl.GL_STATIC_DRAW_ARB)
243      #
244      # Do the same for the element buffer
245      #
246      gl.glGenBuffersARB(1, &self._elmtBuffer)
247      gl.glBindBufferARB(gl.GL_ELEMENT_ARRAY_BUFFER_ARB, self._elmtBuffer)
248      gl.glBufferDataARB(gl.GL_ELEMENT_ARRAY_BUFFER_ARB, sizeof(_elmt), _elmt,
249                         gl.GL_STATIC_DRAW_ARB)
250
251    #
252    ######################################
253    #
254    # Disable unused pointers
255    #
256    #   Unlike Mesh and most other models, Axis doesn't use normals or textures
257    #   so we need to turn these off while rendering an Axis
258    #
259    gl.glDisableClientState(gl.GL_NORMAL_ARRAY)         # No Normals
260    gl.glDisableClientState(gl.GL_TEXTURE_COORD_ARRAY)  # No Texture Coords
261    #
262    ######################################
263    #
264    # Enable color pointer
265    #
266    #   To get color data into the vertices without making three separate
267    #   rendering calls we turn on the color array while rendering
268    #
269    gl.glEnableClientState(gl.GL_COLOR_ARRAY) # We need to render with color arrays
270    #
271    gl.glVertexPointer(3, gl.GL_FLOAT, sizeof(VertPC),  <gl.GLvoid *> 0)
272    gl.glColorPointer (3, gl.GL_FLOAT, sizeof(VertPC), <gl.GLvoid *> 0+12)
273    gl.glDisable(gl.GL_CULL_FACE)
274    gl.glDisable(gl.GL_DEPTH_TEST)
275    gl.glDisable(gl.GL_LIGHTING)
276    gl.glDrawElements(gl.GL_LINES, 24, gl.GL_UNSIGNED_BYTE, <gl.GLvoid *> 0)
277    gl.glEnable(gl.GL_LIGHTING)
278    gl.glEnable(gl.GL_DEPTH_TEST)
279    gl.glEnable(gl.GL_CULL_FACE)
280    gl.glDisableClientState(gl.GL_COLOR_ARRAY)
281    gl.glEnableClientState(gl.GL_TEXTURE_COORD_ARRAY)
282    gl.glEnableClientState(gl.GL_NORMAL_ARRAY)
283    #
284    ######################################
285    #
286    # return to camera matrix
287    #
288    gl.glPopMatrix()
289    #
290    ######################################
291
Note: See TracBrowser for help on using the repository browser.