def draw(self, shader=None, txtrs=None, ntl=None, shny=None, camera=None, mlist=[]): """If called without parameters, there has to have been a previous call to set_draw_details() for each Buffer in buf[]. NB there is no facility for setting umult and vmult with draw: they must be set using set_draw_details or Buffer.set_draw_details. """ self.load_opengl( ) # really just to set the flag so _unload_opengl runs from pi3d.Camera import Camera from pi3d.Shader import Shader camera = camera or self._camera or Camera.instance() shader = shader or self.shader or Shader.instance() shader.use() if self.MFlg or len(mlist): ''' # Calculate rotation and translation matrix for this model using numpy. self.MRaw = dot(self.tr2, dot(self.scl, dot(self.roy, dot(self.rox, dot(self.roz, self.tr1))))) ''' self.MRaw = self.tr1 if self.rozflg: self.MRaw = dot(self.roz, self.MRaw) if self.roxflg: self.MRaw = dot(self.rox, self.MRaw) if self.royflg: self.MRaw = dot(self.roy, self.MRaw) if self.sclflg: self.MRaw = dot(self.scl, self.MRaw) if self.tr2flg: self.MRaw = dot(self.tr2, self.MRaw) # child drawing addition ############# newmlist = [m for m in mlist] newmlist.append(self.MRaw) if len(self.children) > 0: for c in self.children: c.draw(shader, txtrs, ntl, shny, camera, newmlist) for m in mlist[-1::-1]: self.MRaw = dot(self.MRaw, m) ###################################### self.M[0, :, :] = self.MRaw[:, :] #self.M[0:16] = c_floats(self.MRaw.reshape(-1).tolist()) #pypy version self.M[1, :, :] = dot(self.MRaw, camera.mtrx)[:, :] #self.M[16:32] = c_floats(dot(self.MRaw, camera.mtrx).reshape(-1).tolist()) #pypy self.MFlg = False elif camera.was_moved: # Only do this if it's not done because model moved. self.M[1, :, :] = dot(self.MRaw, camera.mtrx)[:, :] if camera.was_moved: self.unif[18:21] = camera.eye[0:3] opengles.glUniformMatrix4fv(shader.unif_modelviewmatrix, 2, ctypes.c_int(0), self.M.ctypes.data) opengles.glUniform3fv(shader.unif_unif, 20, ctypes.byref(self.unif)) for b in self.buf: # Shape.draw has to be passed either parameter == None or values to pass # on. b.draw(self, shader, txtrs, ntl, shny)
def draw(self, shape=None, M=None, unif=None, shader=None, textures=None, ntl=None, shny=None, fullset=True): """Draw this Buffer, called by the parent Shape.draw() Keyword arguments: *shape* Shape object this Buffer belongs to, has to be passed at draw to avoid circular reference *shader* Shader object *textures* array of Texture objects *ntl* multiple for tiling normal map which can be less than or greater than 1.0. 0.0 disables the normal mapping, float *shiny* how strong to make the reflection 0.0 to 1.0, float """ self.load_opengl() shader = shader or self.shader or shape.shader or Shader.instance() shader.use() opengles.glUniformMatrix4fv(shader.unif_modelviewmatrix, 3, ctypes.c_int(0), M.ctypes.data) opengles.glUniform3fv(shader.unif_unif, 20, ctypes.byref(unif)) textures = textures or self.textures if ntl is not None: self.unib[0] = ntl if shny is not None: self.unib[1] = shny self._select() opengles.glVertexAttribPointer(shader.attr_vertex, 3, GL_FLOAT, 0, self.N_BYTES, 0) opengles.glEnableVertexAttribArray(shader.attr_vertex) if self.N_BYTES > 12: opengles.glVertexAttribPointer(shader.attr_normal, 3, GL_FLOAT, 0, self.N_BYTES, 12) opengles.glEnableVertexAttribArray(shader.attr_normal) if self.N_BYTES > 24: opengles.glVertexAttribPointer(shader.attr_texcoord, 2, GL_FLOAT, 0, self.N_BYTES, 24) opengles.glEnableVertexAttribArray(shader.attr_texcoord) opengles.glDisable(GL_BLEND) self.unib[2] = 0.6 for t, texture in enumerate(textures): if (self.disp.last_textures[t] != texture or self.disp.last_shader != shader): # very slight speed increase for sprites opengles.glActiveTexture(GL_TEXTURE0 + t) assert texture.tex(), 'There was an empty texture in your Buffer.' opengles.glBindTexture(GL_TEXTURE_2D, texture.tex()) opengles.glUniform1i(shader.unif_tex[t], t) self.disp.last_textures[t] = texture if texture.blend: # i.e. if any of the textures set to blend then all will for this shader. self.unib[2] = 0.05 if self.unib[2] != 0.6 or shape.unif[5,2] < 1.0 or shape.unif[5,1] < 1.0: #use unib[2] as flag to indicate if any Textures to be blended #needs to be done outside for..textures so materials can be transparent opengles.glEnable(GL_BLEND) self.unib[2] = 0.05 self.disp.last_shader = shader opengles.glUniform3fv(shader.unif_unib, 4, ctypes.byref(self.unib)) opengles.glEnable(GL_DEPTH_TEST) # TODO find somewhere more efficient to do this opengles.glDrawElements(self.draw_method, self.ntris * 3, GL_UNSIGNED_SHORT, 0)
def draw(self, shape=None, M=None, unif=None, shader=None, textures=None, ntl=None, shny=None, fullset=True): """Draw this Buffer, called by the parent Shape.draw() Keyword arguments: *shape* Shape object this Buffer belongs to, has to be passed at draw to avoid circular reference *shader* Shader object *textures* array of Texture objects *ntl* multiple for tiling normal map which can be less than or greater than 1.0. 0.0 disables the normal mapping, float *shiny* how strong to make the reflection 0.0 to 1.0, float """ self.load_opengl() shader = shader or self.shader or shape.shader or Shader.instance() shader.use() opengles.glUniformMatrix4fv(shader.unif_modelviewmatrix, GLsizei(3), GLboolean(0), M.ctypes.data) opengles.glUniform3fv(shader.unif_unif, GLsizei(20), unif) textures = textures or self.textures if ntl is not None: self.unib[0] = ntl if shny is not None: self.unib[1] = shny self._select() opengles.glVertexAttribPointer(shader.attr_vertex, GLint(3), GL_FLOAT, GLboolean(0), self.N_BYTES, 0) opengles.glEnableVertexAttribArray(shader.attr_vertex) if self.N_BYTES > 12: opengles.glVertexAttribPointer(shader.attr_normal, GLint(3), GL_FLOAT, GLboolean(0), self.N_BYTES, 12) opengles.glEnableVertexAttribArray(shader.attr_normal) if self.N_BYTES > 24: opengles.glVertexAttribPointer(shader.attr_texcoord, GLint(2), GL_FLOAT, GLboolean(0), self.N_BYTES, 24) opengles.glEnableVertexAttribArray(shader.attr_texcoord) opengles.glDisable(GL_BLEND) self.unib[2] = 0.6 for t, texture in enumerate(textures): if (self.disp.last_textures[t] != texture or self.disp.last_shader != shader or self.disp.offscreen_tex): # very slight speed increase for sprites opengles.glActiveTexture(GL_TEXTURE0 + t) assert texture.tex(), 'There was an empty texture in your Buffer.' opengles.glBindTexture(GL_TEXTURE_2D, texture.tex()) opengles.glUniform1i(shader.unif_tex[t], GLint(t)) self.disp.last_textures[t] = texture if texture.blend: # i.e. if any of the textures set to blend then all will for this shader. self.unib[2] = 0.05 if self.unib[2] != 0.6 or shape.unif[13] < 1.0 or shape.unif[14] < 1.0: #use unib[2] as flag to indicate if any Textures to be blended #needs to be done outside for..textures so materials can be transparent opengles.glEnable(GL_BLEND) self.unib[2] = 0.05 self.disp.last_shader = shader opengles.glUniform3fv(shader.unif_unib, GLsizei(5), self.unib) opengles.glEnable(GL_DEPTH_TEST) # TODO find somewhere more efficient to do this opengles.glDrawElements(self.draw_method, GLsizei(self.ntris * 3), GL_UNSIGNED_SHORT, 0)
def draw(self, shader=None, txtrs=None, ntl=None, shny=None, camera=None, mlist=[]): """If called without parameters, there has to have been a previous call to set_draw_details() for each Buffer in buf[]. NB there is no facility for setting umult and vmult with draw: they must be set using set_draw_details or Buffer.set_draw_details. """ self.load_opengl() # really just to set the flag so _unload_opengl runs from pi3d.Camera import Camera from pi3d.Shader import Shader camera = camera or self._camera or Camera.instance() shader = shader or self.shader or Shader.instance() shader.use() if self.MFlg or len(mlist) > 0: ''' # Calculate rotation and translation matrix for this model using numpy. self.MRaw = dot(self.tr2, dot(self.scl, dot(self.roy, dot(self.rox, dot(self.roz, self.tr1))))) ''' self.MRaw = self.tr1 if self.rozflg: self.MRaw = dot(self.roz, self.MRaw) if self.roxflg: self.MRaw = dot(self.rox, self.MRaw) if self.royflg: self.MRaw = dot(self.roy, self.MRaw) if self.sclflg: self.MRaw = dot(self.scl, self.MRaw) if self.tr2flg: self.MRaw = dot(self.tr2, self.MRaw) # child drawing addition ############# newmlist = [m for m in mlist] newmlist.append(self.MRaw) if len(self.children) > 0: for c in self.children: c.draw(shader, txtrs, ntl, shny, camera, newmlist) # TODO issues where child doesn't use same shader for m in mlist[-1::-1]: self.MRaw = dot(self.MRaw, m) ###################################### self.M[0,:,:] = self.MRaw[:,:] #self.M[0:16] = c_floats(self.MRaw.reshape(-1).tolist()) #pypy version self.M[1,:,:] = dot(self.MRaw, camera.mtrx)[:,:] #self.M[16:32] = c_floats(dot(self.MRaw, camera.mtrx).reshape(-1).tolist()) #pypy self.MFlg = False elif camera.was_moved: # Only do this if it's not done because model moved. self.M[1,:,:] = dot(self.MRaw, camera.mtrx)[:,:] if camera.was_moved: self.unif[18:21] = camera.eye[0:3] opengles.glUniformMatrix4fv(shader.unif_modelviewmatrix, 2, ctypes.c_int(0), self.M.ctypes.data) opengles.glUniform3fv(shader.unif_unif, 20, ctypes.byref(self.unif)) for b in self.buf: # Shape.draw has to be passed either parameter == None or values to pass # on. b.draw(self, shader, txtrs, ntl, shny)