Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
gmsh
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Larry Price
gmsh
Commits
0199cab5
Commit
0199cab5
authored
14 years ago
by
Gilles Marckmann
Browse files
Options
Downloads
Patches
Plain Diff
mainGlut has been modified to use camera viewing (with command
gluLookAt() ) and tou be able to turn on stereo device
parent
0356a7b9
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
utils/api_demos/mainGlut.cpp
+405
-42
405 additions, 42 deletions
utils/api_demos/mainGlut.cpp
with
405 additions
and
42 deletions
utils/api_demos/mainGlut.cpp
+
405
−
42
View file @
0199cab5
//
// A simple example on how to build a GUI frontend to Gmsh using GLUT
//
...
...
@@ -5,118 +6,480 @@
#if defined(__APPLE__)
# include <GLUT/glut.h>
#else
# include <GL/gl.h>
# include <GL/glut.h>
# include <GL/glu.h>
#endif
#include
"Gmsh.h"
#include
<stdio.h>
#include
"string.h"
#include
"GModel.h"
#include
"MElement.h"
#include
"Context.h"
#include
"drawContext.h"
#include
"Trackball.h"
#include
"Camera.h"
typedef
struct
{
double
r
,
g
,
b
;
}
COLOUR
;
typedef
struct
{
unsigned
char
r
,
g
,
b
,
a
;
}
PIXELA
;
using
namespace
std
;
drawContext
*
ctx
=
0
;
Camera
camera
;
mouseAndKeyboard
mouseandkeys
;
static
int
xprev
=
0
,
yprev
=
0
,
specialkey
=
0
;
class
drawContextGlut
:
public
drawContextGlobal
{
public:
public:
void
draw
(){
ctx
->
draw3d
();
ctx
->
draw2d
();
}
const
char
*
getFontName
(
int
index
){
return
"Helvetica"
;
}
int
getFontSize
(){
return
1
8
;
}
int
getFontSize
(){
return
1
2
;
}
double
getStringWidth
(
const
char
*
str
)
{
return
glutBitmapLength
(
GLUT_BITMAP_HELVETICA_1
8
,
(
const
unsigned
char
*
)
str
);
return
glutBitmapLength
(
GLUT_BITMAP_HELVETICA_1
2
,
(
const
unsigned
char
*
)
str
);
}
int
getStringHeight
(){
return
1
8
;
}
int
getStringHeight
(){
return
1
2
;
}
int
getStringDescent
(){
return
6
;
}
void
drawString
(
const
char
*
str
)
{
for
(
int
i
=
0
;
i
<
strlen
(
str
);
i
++
)
glutBitmapCharacter
(
GLUT_BITMAP_HELVETICA_18
,
str
[
i
]);
}
};
// GLUT callbacks
void
display
()
{
glViewport
(
ctx
->
viewport
[
0
],
ctx
->
viewport
[
1
],
ctx
->
viewport
[
2
],
ctx
->
viewport
[
3
]);
glClear
(
GL_DEPTH_BUFFER_BIT
|
GL_COLOR_BUFFER_BIT
);
drawContext
::
global
()
->
draw
();
glutSwapBuffers
();
if
(
!
camera
.
stereoEnable
)
{
// cout<<" display();"<<endl;
glViewport
(
ctx
->
viewport
[
0
],
ctx
->
viewport
[
1
],
ctx
->
viewport
[
2
],
ctx
->
viewport
[
3
]);
glClear
(
GL_DEPTH_BUFFER_BIT
|
GL_COLOR_BUFFER_BIT
);
double
dist
,
ratio
,
radians
,
scale
,
wd2
,
ndfl
,
left
,
right
,
top
,
bottom
;
double
near
=
0.1
;
double
far
=
10000
;
double
h
=
1.
*
(
ctx
->
viewport
[
3
]
-
ctx
->
viewport
[
1
]);
double
w
=
1.
*
(
ctx
->
viewport
[
2
]
-
ctx
->
viewport
[
0
])
;
ratio
=
w
/
h
;
radians
=
0.0174532925
*
camera
.
aperture
/
2
;
wd2
=
near
*
tan
(
radians
);
ndfl
=
near
/
camera
.
focallength
;
ndfl
=
1
;
// fill the background
// ctx->initProjection();
// defines the lights
// ctx->initRenderModel();
// defines screen plane and frame
glMatrixMode
(
GL_PROJECTION
);
glLoadIdentity
();
left
=
-
ratio
*
wd2
;
right
=
ratio
*
wd2
;
top
=
wd2
;
bottom
=
-
wd2
;
glFrustum
(
left
,
right
,
bottom
,
top
,
near
,
far
);
glMatrixMode
(
GL_MODELVIEW
);
glDrawBuffer
(
GL_BACK
);
glClear
(
GL_COLOR_BUFFER_BIT
|
GL_DEPTH_BUFFER_BIT
);
glLoadIdentity
();
gluLookAt
(
camera
.
position
.
x
,
camera
.
position
.
y
,
camera
.
position
.
z
,
camera
.
target
.
x
,
camera
.
target
.
y
,
camera
.
target
.
z
,
camera
.
up
.
x
,
camera
.
up
.
y
,
camera
.
up
.
z
);
drawContext
::
global
()
->
draw
();
glutSwapBuffers
();
}
else
{
// cout<<" display3D();"<<endl;
glViewport
(
ctx
->
viewport
[
0
],
ctx
->
viewport
[
1
],
ctx
->
viewport
[
2
],
ctx
->
viewport
[
3
]);
glClear
(
GL_DEPTH_BUFFER_BIT
|
GL_COLOR_BUFFER_BIT
);
double
dist
,
ratio
,
radians
,
scale
,
wd2
,
ndfl
,
left
,
right
,
top
,
bottom
;
double
near
=
0.1
;
double
far
=
10000
;
double
h
=
1.
*
(
ctx
->
viewport
[
3
]
-
ctx
->
viewport
[
1
]);
double
w
=
1.
*
(
ctx
->
viewport
[
2
]
-
ctx
->
viewport
[
0
])
;
// 4:3 , 16:9, ...
ratio
=
w
/
h
;
// demi angle de vue (en radian)
radians
=
0.0174532925
*
camera
.
aperture
/
2
;
wd2
=
near
*
tan
(
radians
);
ndfl
=
near
/
camera
.
focallength
;
XYZ
eye
;
// fill the background
// ctx->initProjection();
// defines the lights
// ctx->initRenderModel();
//right eye
eye
.
x
=
camera
.
right
.
x
*
camera
.
eyesep
/
2.0
;
eye
.
y
=
camera
.
right
.
y
*
camera
.
eyesep
/
2.0
;
eye
.
z
=
camera
.
right
.
z
*
camera
.
eyesep
/
2.0
;
glMatrixMode
(
GL_PROJECTION
);
glLoadIdentity
();
left
=
-
ratio
*
wd2
-
0.5
*
camera
.
eyesep
*
ndfl
;
right
=
ratio
*
wd2
-
0.5
*
camera
.
eyesep
*
ndfl
;
top
=
wd2
;
bottom
=
-
wd2
;
glFrustum
(
left
,
right
,
bottom
,
top
,
near
,
far
);
glMatrixMode
(
GL_MODELVIEW
);
glDrawBuffer
(
GL_BACK_RIGHT
);
glClear
(
GL_COLOR_BUFFER_BIT
|
GL_DEPTH_BUFFER_BIT
);
glLoadIdentity
();
gluLookAt
(
camera
.
position
.
x
+
eye
.
x
,
camera
.
position
.
y
+
eye
.
y
,
camera
.
position
.
z
+
eye
.
z
,
camera
.
target
.
x
+
eye
.
x
,
camera
.
target
.
y
+
eye
.
y
,
camera
.
target
.
z
+
eye
.
z
,
camera
.
up
.
x
,
camera
.
up
.
y
,
camera
.
up
.
z
);
drawContext
::
global
()
->
draw
();
//left eye
glMatrixMode
(
GL_PROJECTION
);
glLoadIdentity
();
left
=
-
ratio
*
wd2
+
0.5
*
camera
.
eyesep
*
ndfl
;
right
=
ratio
*
wd2
+
0.5
*
camera
.
eyesep
*
ndfl
;
top
=
wd2
;
bottom
=
-
wd2
;
glFrustum
(
left
,
right
,
bottom
,
top
,
near
,
far
);
glMatrixMode
(
GL_MODELVIEW
);
glDrawBuffer
(
GL_BACK_LEFT
);
glClear
(
GL_COLOR_BUFFER_BIT
|
GL_DEPTH_BUFFER_BIT
);
glLoadIdentity
();
gluLookAt
(
camera
.
position
.
x
-
eye
.
x
,
camera
.
position
.
y
-
eye
.
y
,
camera
.
position
.
z
-
eye
.
z
,
camera
.
target
.
x
-
eye
.
x
,
camera
.
target
.
y
-
eye
.
y
,
camera
.
target
.
z
-
eye
.
z
,
camera
.
up
.
x
,
camera
.
up
.
y
,
camera
.
up
.
z
);
drawContext
::
global
()
->
draw
();
glutSwapBuffers
();
}
}
void
reshape
(
int
w
,
int
h
)
{
ctx
->
viewport
[
2
]
=
w
;
ctx
->
viewport
[
3
]
=
h
;
display
();
display
();
}
void
keyboard
(
unsigned
char
key
,
int
x
,
int
y
)
{
switch
(
key
){
case
'1'
:
GModel
::
current
()
->
mesh
(
1
);
break
;
case
'2'
:
GModel
::
current
()
->
mesh
(
2
);
break
;
case
'3'
:
GModel
::
current
()
->
mesh
(
3
);
break
;
}
display
();
}
static
int
xprev
=
0
,
yprev
=
0
,
specialkey
=
0
;
void
motion
(
int
x
,
int
y
)
{
int
w
=
ctx
->
viewport
[
2
];
int
h
=
ctx
->
viewport
[
3
];
if
(
specialkey
==
GLUT_ACTIVE_SHIFT
){
double
dx
=
x
-
xprev
;
double
dy
=
y
-
yprev
;
if
(
fabs
(
dy
)
>
fabs
(
dx
))
{
double
fact
=
(
4.
*
fabs
(
dy
)
+
h
)
/
(
double
)
h
;
ctx
->
s
[
0
]
*=
((
dy
>
0
)
?
fact
:
1.
/
fact
);
ctx
->
s
[
1
]
=
ctx
->
s
[
0
];
ctx
->
s
[
2
]
=
ctx
->
s
[
0
];
}
int
w
=
(
ctx
->
viewport
[
2
]
-
ctx
->
viewport
[
0
]);
int
h
=
(
ctx
->
viewport
[
3
]
-
ctx
->
viewport
[
1
]);
//rotate
if
(
mouseandkeys
.
button_left_down
&&
(
mouseandkeys
.
mode
!=
GLUT_ACTIVE_CTRL
)
){
double
x_r
=
2.
*
(
1.
*
x
-
w
/
2.
)
/
w
;
double
y_r
=
2.
*
(
1.
*
y
-
h
/
2.
)
/
h
;
double
xprev_r
=
2.
*
(
1.
*
xprev
-
w
/
2.
)
/
w
;
double
yprev_r
=
2.
*
(
1.
*
yprev
-
h
/
2.
)
/
h
;
double
q
[
4
];
trackball
(
q
,
xprev_r
,
yprev_r
,
x_r
,
y_r
);
camera
.
rotate
(
q
);
xprev
=
x
;
yprev
=
y
;
}
else
{
ctx
->
addQuaternion
((
2.
*
xprev
-
w
)
/
w
,
(
h
-
2.
*
yprev
)
/
h
,
(
2.
*
x
-
w
)
/
w
,
(
h
-
2.
*
y
)
/
h
);
//zoom
if
(
mouseandkeys
.
button_middle_down
){
double
dy
=
y
-
yprev
;
double
factor
=
(
CTX
::
instance
()
->
zoomFactor
*
fabs
(
dy
)
+
(
double
)
h
)
/
(
double
)
h
;
factor
=
((
dy
>
0
)
?
factor
:
1.
/
factor
);
// cout<<" zoom factor: "<<factor<<endl;
camera
.
distance
=
fabs
(
1.
/
factor
*
camera
.
ref_distance
);
camera
.
position
.
x
=
camera
.
target
.
x
-
camera
.
distance
*
camera
.
view
.
x
;
camera
.
position
.
y
=
camera
.
target
.
y
-
camera
.
distance
*
camera
.
view
.
y
;
camera
.
position
.
z
=
camera
.
target
.
z
-
camera
.
distance
*
camera
.
view
.
z
;
}
// translate
if
(
mouseandkeys
.
button_right_down
){
// cout<<" prev: "<<xprev<<" "<<yprev<<"-> x,y: "<<x<<" "<<y<<endl;
double
x_r
=
2.
*
(
1.
*
x
-
w
/
2.
)
/
w
;
double
y_r
=
2.
*
(
1.
*
y
-
h
/
2.
)
/
h
;
double
xprev_r
=
2.
*
(
1.
*
xprev
-
w
/
2.
)
/
w
;
double
yprev_r
=
2.
*
(
1.
*
yprev
-
h
/
2.
)
/
h
;
double
theta_x
=
camera
.
aperture
*
(
x_r
-
xprev_r
)
*
0.0174532925
/
2.
;
double
theta_y
=
camera
.
aperture
*
(
y_r
-
yprev_r
)
*
0.0174532925
/
2.
;
// cout<<" theta_x : "<<theta_x<<endl;
// cout<<" theta_y : "<<theta_y<<endl;
camera
.
moveRight
(
theta_x
);
camera
.
moveUp
(
theta_y
);
xprev
=
x
;
yprev
=
y
;
}
if
(
!
mouseandkeys
.
button_middle_down
){
xprev
=
x
;
yprev
=
y
;
}
xprev
=
x
;
yprev
=
y
;
display
();
}
void
mouse
(
int
button
,
int
state
,
int
x
,
int
y
)
{
specialkey
=
glutGetModifiers
();
xprev
=
x
;
yprev
=
y
;
if
(
button
==
GLUT_LEFT_BUTTON
)
{
mouseandkeys
.
button_left_down
=!
state
;
}
else
if
(
button
==
GLUT_MIDDLE_BUTTON
)
{
mouseandkeys
.
button_middle_down
=!
state
;
}
else
{
mouseandkeys
.
button_right_down
=!
state
;
}
camera
.
ref_distance
=
camera
.
distance
;
}
void
processSpecialKeys
(
int
key
,
int
x
,
int
y
)
{
mouseandkeys
.
mode
=
glutGetModifiers
();
if
(
mouseandkeys
.
mode
==
GLUT_ACTIVE_CTRL
)
{
// cout<<"CTRL "<<key<<endl;
switch
(
key
){
case
100
:
/* 'left' */
// camera.closeness*=.99;
display
();
camera
.
focallength
=
camera
.
focallength
*
.99
;
camera
.
eyesep
=
(
camera
.
focallength
/
camera
.
distance
)
*
camera
.
distance
*
camera
.
ratio
;
break
;
case
102
:
/* 'right' */
//camera.closeness*=1.01;
camera
.
focallength
=
camera
.
focallength
*
1.01
;
camera
.
eyesep
=
(
camera
.
focallength
/
camera
.
distance
)
*
camera
.
distance
*
camera
.
ratio
;
display
();
break
;
}
}
else
{
switch
(
key
){
mouseandkeys
.
key
=
key
;
// cout<<"special key "<<key<<endl;
// cout<<"move in special key :"<<x<<" "<<y<<endl;
case
101
:
/* 'up' */
camera
.
focallength
*=
1.1
;
// display();
break
;
case
103
:
/* 'down' */
camera
.
focallength
*=
0.9
;
// display();
break
;
case
100
:
/* 'left' */
camera
.
eyesep
*=
.9
;
// display();
break
;
case
102
:
/* 'right' */
camera
.
eyesep
*=
1.1
;
// display();
break
;
}
}
// camera.ratio=camera.eyesep/camera.focallength;
// camera.closeness= camera.distance/camera.focallength;
camera
.
update
();
display
();
cout
<<
"eyesep = "
<<
camera
.
eyesep
<<
" / focallength = "
<<
camera
.
focallength
<<
" / ratio = "
;
cout
<<
camera
.
ratio
<<
" / distance = "
<<
camera
.
distance
<<
" / closeness = "
<<
camera
.
closeness
<<
endl
;
mouseandkeys
.
mode
=
0
;
}
void
processNormalKeys
(
unsigned
char
key
,
int
x
,
int
y
)
{
double
def
;
if
(
key
!=
0
)
{
// cout<<"normal key "<<key;
mouseandkeys
.
key
=
key
;
// cout<<" = "<<mouseandkeys.key<<endl;
// cout<<"move in normal key :"<<x<<" "<<y<<endl;
mouseandkeys
.
mode
=
glutGetModifiers
();
// if (mouseandkeys.mode == GLUT_ACTIVE_CTRL) cout<<"CTRL "<<key<<endl;
if
(
mouseandkeys
.
mode
==
GLUT_ACTIVE_CTRL
&&
key
==
17
)
exit
(
0
);
}
switch
(
key
){
case
49
:
GModel
::
current
()
->
mesh
(
1
);
break
;
/* '1' */
case
50
:
GModel
::
current
()
->
mesh
(
2
);
break
;
/* '2' */
case
51
:
GModel
::
current
()
->
mesh
(
3
);
break
;
/* '3' */
case
48
:
/* '0' */
camera
.
lookAtCg
();
display
();
break
;
case
114
:
/* 'R' */
camera
.
init
();
display
();
break
;
case
'f'
:
/* 'F' */
camera
.
screenwidth
=
ctx
->
viewport
[
2
];
camera
.
screenheight
=
ctx
->
viewport
[
3
];
glutFullScreen
();
display
();
break
;
case
27
:
/* 'ech' */
glutReshapeWindow
(
camera
.
screenwidth
,
camera
.
screenheight
);
//glutReshapeWindow(500,500 );
display
();
break
;
case
100
:
;
/* 'D' */
GmshSetOption
(
"View"
,
"VectorType"
,
5.
);
display
();
break
;
case
43
:
/* '+' */
GmshGetOption
(
"View"
,
"DisplacementFactor"
,
def
);
def
*=
2.
;
GmshSetOption
(
"View"
,
"DisplacementFactor"
,
def
);
display
();
break
;
case
45
:
;
/* '-' */
GmshGetOption
(
"View"
,
"DisplacementFactor"
,
def
);
def
*=
.5
;
GmshSetOption
(
"View"
,
"DisplacementFactor"
,
def
);
display
();
break
;
case
112
:
/* 'p' */
// cout<<"*--*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*--*-*-*-*-*-*-*-*-*-*-***-*---*-***-"<<endl;
break
;
}
}
//*******************************************************
//*******************************************************
//*******************************************************
int
main
(
int
argc
,
char
**
argv
)
{
GmshInitialize
(
argc
,
argv
);
GmshSetOption
(
"General"
,
"Terminal"
,
1.
);
GmshSetOption
(
"View"
,
"IntervalsType"
,
1.
);
GmshSetOption
(
"View"
,
"AdaptVisualizationGrid"
,
1.
);
GmshSetOption
(
"View"
,
"TargetError"
,
0.00001
);
GmshSetOption
(
"View"
,
"MaxRecursionLevel"
,
3.
);
GmshSetOption
(
"General"
,
"Stereo"
,
0.
);
GmshSetOption
(
"General"
,
"Camera"
,
1.
);
GmshSetOption
(
"General"
,
"Orthographic"
,
0.
);
if
(
strstr
(
argv
[
1
],
"-s"
)
!=
NULL
){
camera
.
stereoEnable
=
true
;
cout
<<
"mode STEREO"
<<
endl
;
GmshSetOption
(
"General"
,
"Stereo"
,
1.
);
}
for
(
int
i
=
1
;
i
<
argc
;
i
++
)
GmshMergeFile
(
argv
[
i
]);
ctx
=
new
drawContext
();
drawContext
::
setGlobal
(
new
drawContextGlut
);
glutInit
(
&
argc
,
argv
);
glutInitDisplayMode
(
GLUT_RGB
|
GLUT_DOUBLE
|
GLUT_DEPTH
);
glutInitWindowSize
(
ctx
->
viewport
[
2
],
ctx
->
viewport
[
3
]);
glutInitWindowPosition
(
100
,
100
);
glutCreateWindow
(
"GLUT Gmsh Viewer"
);
if
(
camera
.
stereoEnable
)
{
glutInitDisplayMode
(
GLUT_DOUBLE
|
GLUT_RGB
|
GLUT_DEPTH
|
GLUT_STEREO
);
// GmshSetOption("General", "BackgroundGradient", 0.);
}
else
{
glutInitDisplayMode
(
GLUT_DOUBLE
|
GLUT_RGB
|
GLUT_DEPTH
);
}
glutDisplayFunc
(
display
);
glutInitWindowSize
(
ctx
->
viewport
[
2
],
ctx
->
viewport
[
3
]);
glutInitWindowPosition
(
400
,
10
);
glutInitWindowSize
(
800
,
800
);
glutCreateWindow
(
"GLUT Gmsh Viewer"
);
camera
.
lookAtCg
();
glutReshapeFunc
(
reshape
);
glutKeyboardFunc
(
keyboard
);
glutMotionFunc
(
motion
);
glutMouseFunc
(
mouse
);
glutKeyboardFunc
(
processNormalKeys
);
glutSpecialFunc
(
processSpecialKeys
);
cout
<<
"-------------------------------------"
<<
endl
;
cout
<<
" SHORTCUTS "
<<
endl
;
cout
<<
"-------------------------------------"
<<
endl
;
cout
<<
" Ctrl+Q Quit "
<<
endl
;
cout
<<
" 1 mesh line "
<<
endl
;
cout
<<
" 2 mesh surface "
<<
endl
;
cout
<<
" 3 mesh volume "
<<
endl
;
cout
<<
" R resize "
<<
endl
;
cout
<<
" 0 origine "
<<
endl
;
cout
<<
" option -s stereo on "
<<
endl
;
cout
<<
" F full screen on "
<<
endl
;
cout
<<
" ech full screen off"
<<
endl
;
cout
<<
" D displacement field"
<<
endl
;
cout
<<
" + deformed +"
<<
endl
;
cout
<<
" - deformed -"
<<
endl
;
cout
<<
" up focal length +"
<<
endl
;
cout
<<
" down focal length -"
<<
endl
;
cout
<<
" left eye sep -"
<<
endl
;
cout
<<
" right eye sep +"
<<
endl
;
cout
<<
"-------------------------------------"
<<
endl
;
glutMainLoop
();
GmshFinalize
();
return
0
;
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment