def TextureBitmap(self,image=r".\images\Mire_R.bmp",size=0.1): #On charge l'image texture à plaquer #@note: http://www.fil.univ-lille1.fr/~aubert/p3d/Cours04.pdf self.TexSize=size image_bmp=wx.Image(image) #Remise des coordonnées y dans le sens OpenGL différent de l'écran image_bmp=image_bmp.Mirror(horizontally=False) image_bmp=image_bmp.ConvertToBitmap() self.ix=image_bmp.Width self.iy=image_bmp.Height image_buffer = numpy.ones((self.ix,self.iy,3), numpy.uint8) image_bmp.CopyToBuffer(image_buffer) image=image_buffer.data self.TexID=gl.glGenTextures(1)#récupère un ID d'objet-texture unique et libre gl.glBindTexture(gl.GL_TEXTURE_2D, self.TexID)# annonce l'utilisation d'une texture 2D pour objet-texture ID #(toutes les fonctions de texture s'applique désormais à cet onjet-texture ID) gl.glPixelStorei(gl.GL_UNPACK_ALIGNMENT,1) #préviens que les données de la texture sont brut gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGB, self.ix, self.iy, 0,gl.GL_RGB, gl.GL_UNSIGNED_BYTE, image_buffer) #charge la texture 2D gl.glTexParameterf(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_LINEAR) gl.glTexParameterf(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MIN_FILTER, gl.GL_LINEAR) gl.glTexParameterf(gl.GL_TEXTURE_2D,gl.GL_TEXTURE_WRAP_S,gl.GL_CLAMP_TO_BORDER_ARB ) gl.glTexParameterf(gl.GL_TEXTURE_2D,gl.GL_TEXTURE_WRAP_T,gl.GL_CLAMP_TO_BORDER_ARB ) gl.glTexEnvf(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_MODULATE) gl.glTexGeni(gl.GL_S,gl.GL_TEXTURE_GEN_MODE,gl.GL_OBJECT_LINEAR) gl.glEnable(gl.GL_TEXTURE_GEN_S) gl.glTexGeni(gl.GL_T,gl.GL_TEXTURE_GEN_MODE,gl.GL_OBJECT_LINEAR) gl.glEnable(gl.GL_TEXTURE_GEN_T) gl.glTexGendv(gl.GL_S,gl.GL_OBJECT_PLANE,(size,0,0,0)) gl.glTexGendv(gl.GL_T,gl.GL_OBJECT_PLANE,(0,size,0,0)) gl.glEnable(gl.GL_BLEND) gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA) gl.glTexParameterfv(gl.GL_TEXTURE_2D,gl. GL_TEXTURE_BORDER_COLOR,(1,1,1,1))
def mDessine(self,event): """ Fonction Principale pour dessiner la scéne "OpenGL" Cette fonction est la fonction callback de l'événement PAINT [self.Bind(wx.EVT_PAINT, self.mDessine)] Fortement utiliser dans toutes l'Application elle est appelé indirectement via la fonction Refresh(True) de l'objet oVisuOpenGL ATTENTION!! Chaque Ajout dans cette fonction peut ralentir l'animation OpenGL!!! """ #Vérifie qu'il n'y a rien dans la queue if not self.q.empty()==True: [self.points,self.cell_data],_flag_cache,_filein=self.q.get() #on récupère les points, on récupère le flag pour savoir si les points viennent du cache ou pas if _flag_cache==0:# si les données ne viennent pas du cache il faut les mettre self._frame.cache_liste_points[_filein]=[self.points,self.cell_data] self.flag_new_set_of_points-=1 self._frame.m_textCtrl_console.AppendText(".") #Récupération des Map de couleur dans les cell_data, mis à jour de la liste de choix couleur self._frame.m_choice_vtk_color.Clear() self._frame.m_choice_vtk_color.Append("Z-Hauteur") for _i in self.cell_data: self.cd_max[_i],self.cd_min[_i]=min(self.cell_data[_i]),max(self.cell_data[_i]) self._frame.m_choice_vtk_color.Append(_i) self._frame.m_choice_vtk_color.SetSelection(0) self.TableCouleur="Z-Hauteur" self.dl,_,_,_=self.mCreerDisplayList() #Création de tuple de couleur HSV if not self.flag_color_change==0: #cas de changement de saturation/couleur (cf NoteBook.OnScroll_slider_vtk) ou HSV_tuples = [(x*0.5/self.N, float(self._frame.m_slider_vtk.GetValue())/100.0, float(self._frame.m_slider_vtk.GetValue())/100.0) for x in range(self.N)] HSV_tuples = Common.RotateList(HSV_tuples, self._frame.m_slider_vtk_color.GetValue()) self.RGB_tuples = map(lambda x: colorsys.hsv_to_rgb(*x), HSV_tuples) self.flag_color_change=0 self.dl,_,_,_=self.mCreerDisplayList() if not self.flag_texture_change==0: #Cas d'un changement dans les paramêtres GUI de la texture # 0 pas de changement # -1 texture devient inactif # 1 texture devient actif # 2 changement de texture # 3 changement de taille #cf Notebook if self.flag_texture_change==1: gl.glEnable(gl.GL_TEXTURE_2D) if self.flag_texture_change==-1: gl.glDisable(gl.GL_TEXTURE_2D) if self.flag_texture_change==2: self.TextureBitmap(image=r"./images/"+self._frame.m_choice_texture.LabelText,size=(10.0/float(self._frame.m_slider_texture.GetValue()))) if self.flag_texture_change==3: self.CoordTex[0]=self.CoordTex[0]/self.TexSize self.CoordTex[1]=self.CoordTex[1]/self.TexSize self.TexSize=10.0/float(self._frame.m_slider_texture.GetValue()) gl.glTexGendv(gl.GL_S,gl.GL_OBJECT_PLANE,(self.TexSize,0,0,0)) gl.glTexGendv(gl.GL_T,gl.GL_OBJECT_PLANE,(0,self.TexSize,0,0)) self.CoordTex[0]=self.CoordTex[0]*self.TexSize self.CoordTex[1]=self.CoordTex[1]*self.TexSize self.flag_texture_change=0 #Indique que les instructions OpenGL s'adressent au contexte OpenGL courant self.SetCurrent() if not self.init: self.mInitOpenGL() #On crée les couleurs et la display list self.dl,_,_,_=self.mCreerDisplayList() self.init = True #initialise les données liées à la gestion de la profondeur gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT) # initialise GL_MODELVIEW # place le repère en (0,0,0) gl.glLoadIdentity() #On positionne la caméra if self.flag_reset_view==1: #cas ou l'on remet la caméra en position "moyenne" lorsque l'on clique sur le bouton Reset View (cf NoteBook) self.rz,self.ry,self.pz=(0.0,0.0,22.0) self.flag_reset_view=0 self.CoordTex=[0,0,0,0,0,0] self.mean,self.max,self.min=Common.MeanMaxMin(self.points) self.mSetVue() gl.glMatrixMode(gl.GL_TEXTURE) gl.glLoadIdentity() gl.glRotate(self.CoordTex[3],0.0,0.0,1.0) gl.glRotate(self.CoordTex[4],1.0,0.0,0.0) gl.glTranslate(self.CoordTex[0],self.CoordTex[1],0) gl.glMatrixMode(gl.GL_MODELVIEW) gl.glCallList(self.dl) self.mDrawFloor() self.mDrawAxes() #Finalement, envoi du dessin à l écran gl.glFlush() self.SwapBuffers() event.Skip()