Alors je sais pas si ça vient de wxwidget ou d'opengl mais le fait est que sur des ordis ayant des cartes graphiques supérieurs aux 6600 ça fonctionne et endessous j'ai un décalage(variant je crois) de plusieurs dixaines de pixels.
Je le vois bien sur mon rectangle de sélection mais pour lui c'est plus minime .
De plus je dois avoué que j'utilise pas le partage de context entre mes fenètres opengl, mais j'utilise le même ce qui me force à faire un resize du GlCanvas à chaque OnDraw.
Sur ma 7600 le ReadPixel est parfaitement précis.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 void SceneCanvas::OnForceSize() { int Width, Height; GetClientSize(&Width, &Height); if ( Height == 0 ) Height = 1; if ( Width == 0 ) Width = 1; #ifndef __WXMOTIF__ if ( GetContext() ) #endif { ViewAspect=1.0; int Decalage = 0; SetCurrent(); if(Width>Height) { //ViewAspect=Width/Height; Decalage= (Width - Height)/2; Width=Height; glViewport(Decalage,0,Width,Height); } else { //ViewAspect=1; Decalage= (Height - Width)/2; Height=Width; glViewport(0,Decalage,Width,Height); } glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(ViewFovy,ViewAspect,ViewProche,ViewLoin); glMatrixMode(GL_MODELVIEW); } }
Le décalage ne viens pas du buffer sélectionné , ou que ça soit du bi écran placé gauche ou à droite.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 glReadPixels(X+viewport[0]*2,viewport[3]-Y+viewport[1]*2,1,1,GL_RGBA,GL_UNSIGNED_BYTE,(void *)m_Repere->m_pixel);
Pour dessiner ma sélection pour éviter se décalage , j'ai fait de la dicotomie :p, Mais ça reste imprécis sur les cartes < ou = à la 6600
Maintenant si ça vient de wxwidget se que je soupçonne aussi (car avant je n'avais pas un décalage aussi flagrant entre le rectangle de sélection et la sourie, sur des ati Nividia de toutes sortes). Mais vous allez me dire avant quoi ? :p
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64 int Width, Height; m_Window->GetClientSize(&Width, &Height); if ( Height == 0 ) Height = 1; if ( Width == 0 ) Width = 1; //* float coefficient = 0.5; float coefficient01x= 0.826;//0.413/0.5//recherche par dicotomie float coefficient01y= 0.847; if(Width>Height) { coefficient01x=(float)Width*coefficient01y / (float)Height; } else { coefficient01y=(float)Height*coefficient01x / (float)Width; } float x1= ((float)m_RectSelection.GetBottomRight().x)/((float)Width )-coefficient; float y1=-((float)m_RectSelection.GetBottomRight().y)/((float)Height)+coefficient; float x2= ((float)m_RectSelection.GetLeftTop().x) /((float)Width )-coefficient; float y2=-((float)m_RectSelection.GetLeftTop().y) /((float)Height)+coefficient; //coordonnées de mes points 3D formant le //rectangle de sélection: x1*=coefficient01x; y1*=coefficient01y; x2*=coefficient01x; y2*=coefficient01y; float z =-(m_ViewProche);//affiche les points à la distance //m_ViewProche .... //Rendu glDisable(GL_CULL_FACE); glPushMatrix(); glLoadIdentity(); glDisable(GL_DEPTH_TEST); glColor3f(1.0, 0.0, 0.0); glBegin(GL_LINE_LOOP); glVertex3f(x1 , y1, z); glVertex3f(x2 , y1, z); glVertex3f(x2 , y2, z); glVertex3f(x1 , y2, z); glEnd(); glEnable(GL_BLEND); glColor3f(0.5, 0.5, 0.5); glBegin(GL_QUADS); glVertex3f(x1 , y1, z); glVertex3f(x2 , y1, z); glVertex3f(x2 , y2, z); glVertex3f(x1 , y2, z); glEnd(); glColor3f(1.0, 1.0, 1.0); glDisable(GL_BLEND); glEnable(GL_DEPTH_TEST); glPopMatrix(); glEnable(GL_CULL_FACE);
Je viens de revoir l'appel des événements . Les événéments du SceneCanvas appel automatiquement les event d'un outil générique , suffit d'y placer un outil courant et il recevra automatiquement les events du scencanvas. Mais si ça vien de ça alors je vois pas comment :p.
EDIT: test tout simple, les coordonnées du pointeur de la sourie correspondent bien à la fenètre (dans l'angle supérieur gauche 0,0), donc je pense pas que ça vienne de wxwidget.
Partager