File: glm_mogldemo.m

package info (click to toggle)
psychtoolbox-3 3.0.14.20170103%2Bgit6-g605ff5c.dfsg1-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 103,044 kB
  • ctags: 69,483
  • sloc: ansic: 167,371; cpp: 11,232; objc: 4,708; sh: 1,875; python: 383; php: 344; makefile: 207; java: 113
file content (134 lines) | stat: -rw-r--r-- 3,677 bytes parent folder | download | duplicates (3)
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
function glm_mogldemo

% GLM_MOGLDEMO  Demonstrate use of MATLAB-OpenGL toolbox independent of Psychtoolbox.
%
% Instead of using Psychtoolbox as host environment, one can also use the built-in
% glm - toolbox. It provides basic functions to open windows, swap buffers, collect
% keyboard responses and such -- a minimalistic Psychtoolbox.
% This demo demonstrates how to use MOGL with glm.
%
% The GLM only works on MacOS-X whereas the Psychtoolbox approach works on
% MacOS-X, GNU/Linux and M$-Windows.

% 15-Dec-2005 -- created (RFM)
% 08-Apr-2006 -- Added comments (MK)

% check the path
if ~exist('glmOpen.m','file'),
    error('add the ''core'' and ''wrap'' directories to the MATLAB search path');
end

% open screen
glmOpen;

% get aspect ratio of screen
xy=glmGetScreenInfo;
ar=xy(2)/xy(1);

% turn on lighting
glEnable(GL.LIGHTING);
glEnable(GL.LIGHT0);
glLightModelfv(GL.LIGHT_MODEL_TWO_SIDE,GL.TRUE);

% set depth properties
glEnable(GL.DEPTH_TEST);
glEnable(GL.CULL_FACE);
glCullFace(GL.BACK);

% define material
glMaterialfv(GL.FRONT_AND_BACK,GL.AMBIENT, [ .33 .22 .03 1 ]);
glMaterialfv(GL.FRONT_AND_BACK,GL.DIFFUSE, [ .78 .57 .11 1 ]);
glMaterialfv(GL.FRONT_AND_BACK,GL.SHININESS,27.8);

% configure for texture
glEnable(GL.TEXTURE_2D);
texname=glGenTextures(6);
load mogldemo.mat face
for i=1:6,
    glBindTexture(GL.TEXTURE_2D,texname(i));
    f=max(min(128*(1+face{i}),255),0);
    tx=repmat(flipdim(f,1),[ 1 1 3 ]);
    tx=permute(flipdim(uint8(tx),1),[ 3 2 1 ]);
    glTexImage2D(GL.TEXTURE_2D,0,GL.RGB,256,256,0,GL.RGB,GL.UNSIGNED_BYTE,tx);
    glTexParameterfv(GL.TEXTURE_2D,GL.TEXTURE_WRAP_S,GL.REPEAT);
    glTexParameterfv(GL.TEXTURE_2D,GL.TEXTURE_WRAP_T,GL.REPEAT);
    glTexParameterfv(GL.TEXTURE_2D,GL.TEXTURE_MAG_FILTER,GL.NEAREST);
    glTexParameterfv(GL.TEXTURE_2D,GL.TEXTURE_MIN_FILTER,GL.NEAREST);
    glTexEnvfv(GL.TEXTURE_ENV,GL.TEXTURE_ENV_MODE,GL.MODULATE);
end

% set projection matrix
glMatrixMode(GL.PROJECTION);
glLoadIdentity;
gluPerspective(45,1/ar,0.1,100);

% set view matrix
glMatrixMode(GL.MODELVIEW);
glLoadIdentity;
gluLookAt(3,3,5,0,0,0,0,1,0);

% set lighting
glLightfv(GL.LIGHT0,GL.POSITION,[ 1 2 3 0 ]);
glLightfv(GL.LIGHT0,GL.DIFFUSE, [ 1 1 1 1 ]);
glLightfv(GL.LIGHT0,GL.AMBIENT, [ .1 .1 .1 1 ]);

% initialize amount and direction of rotation
theta=0;
rotatev=[ 0 0 1 ];

% loop until key pressed
while 1,
    
    % calculate rotation angle
    theta=mod(theta+1,360);
    rotatev=rotatev+0.1*[ sin((pi/180)*theta) sin((pi/180)*2*theta) sin((pi/180)*theta/5) ];
    rotatev=rotatev/sqrt(sum(rotatev.^2));

    % draw a cube (should do this with vertex arrays)
    glPushMatrix;
    glRotated(theta,rotatev(1),rotatev(2),rotatev(3));
    glClear;
    cubeface([ 4 3 2 1 ],texname(1));
    cubeface([ 5 6 7 8 ],texname(2));
    cubeface([ 1 2 6 5 ],texname(3));
    cubeface([ 3 4 8 7 ],texname(4));
    cubeface([ 2 3 7 6 ],texname(5));
    cubeface([ 4 1 5 8 ],texname(6));
    glPopMatrix;

    % show it
    glmSwapBuffers;

    % check for quit signal (keypress or mouse button)
    [xy,b]=glmGetMouse;
    k=max(glmGetKeys);
    if b || k,
        break
    end

end

% shut down
glDeleteTextures(length(texname),texname);
glmClose;

return

% draw one face of a textured cube
function cubeface( i, tx )
v=[ 0 0 0 ; 1 0 0 ; 1 1 0 ; 0 1 0 ; 0 0 1 ; 1 0 1 ; 1 1 1 ; 0 1 1 ]'-0.5;
n=cross(v(:,i(2))-v(:,i(1)),v(:,i(3))-v(:,i(2)));
global GL
glBindTexture(GL.TEXTURE_2D,tx);
glBegin(GL.POLYGON);
glNormal3dv(n);
glTexCoord3dv([ 0 0 ]);
glVertex3dv(v(:,i(1)));
glTexCoord3dv([ 1 0 ]);
glVertex3dv(v(:,i(2)));
glTexCoord3dv([ 1 1 ]);
glVertex3dv(v(:,i(3)));
glTexCoord3dv([ 0 1 ]);
glVertex3dv(v(:,i(4)));
glEnd;
return