Ejemplo n.º 1
0
 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))
Ejemplo n.º 2
0
  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()