source: GTP/trunk/Lib/Illum/GPUObscurancesGT/src/GPUObscurances.cpp @ 930

Revision 930, 20.2 KB checked in by igarcia, 18 years ago (diff)
RevLine 
[930]1// GPUObscurances.
2// Sergi Funtané & Nicolau Sunyer.
3
4#define GLEW_STATIC 1
5#include "glew.h"
6#include <glut.h>
7#include <iostream>
8#include <windows.h>
9#include "textfile.h"
10
11//Includes
12#include "CMesh.h"
13#include "Maths.h"
14
15#include "vcObscuranceMap.h"
16
17//GUI includes
18#include "Main.h"
19#include "MyFrame.h"
20#include <wx/progdlg.h>
21
22
23//To use Offsets in the PBOs.
24#define BUFFER_OFFSET(i) ((char *)NULL + (i))
25
26//GLSL
27// Handlers
28GLuint vRender,fRender,pRender;
29GLuint vDepth, fDepth, pDepth;
30
31//Uniform Parameters
32//Depth Step
33GLint locAngle;
34
35//Render Step
36GLint ProjParam0;
37GLint texture0;
38GLint texture20;
39GLint texture30;
40GLint kd0;
41GLint lpos0;
42GLint Time0;
43GLint ModeDirect0;
44GLint ModeIndirect0;
45GLint ModeAmbient0;
46GLint AmbientIntensity0;
47GLint LightPower0;
48GLint Factor0;
49GLint LightMap0;
50//End GLSL
51
52//FBO
53GLuint fb;
54static GLuint texFBO[2];
55
56//Textures
57static GLuint texNam[2];
58
59int             g_nFPS = 0, g_nFrames = 0;                              // FPS and FPS Counter
60DWORD           g_dwLastFPS = 0;                                        // Last FPS Check Time 
61
62float it        = 0.0;
63
64float angle = 0.0;
65float mode = 0.0;
66float modeDirect = 0.0, modeIndirect = 0.0, modeAmbient = 0.0, modeLight = 0.0;
67float intensityr = 0.5, intensityg = 0.5, intensityb = 0.5, intensityinc = 0.1;
68float lightr = 0.5, lightg = 0.5, lightb = 0.5, lightinc = 0.1;
69float factor = 0.5, factorinc = 0.1;
70//int vsync = 0;
71
72GLfloat *m_pSpotlight=NULL;
73float *ObscuranceMap;
74static CSphere Esf;
75
76//Mouse control
77float zoom = 5.0f;
78float width, height;
79float rotx = 0;
80float roty = 0.001f;
81float tx = 0;
82float ty = 0;
83int lastx=0;
84int lasty=0;
85unsigned char Buttons[3] = {0};
86
87
88MATRIX4X4 project,mview,inverse;
89static MATRIX4X4 biasMatrix(0.5f, 0.0f, 0.0f, 0.0f,
90                                                                0.0f, 0.5f, 0.0f, 0.0f,
91                                                                0.0f, 0.0f, 0.5f, 0.0f,
92                                                                0.5f, 0.5f, 0.5f, 1.0f);        //bias from [-1, 1] to [0, 1]
93MATRIX4X4 textureMatrix;
94CMesh geom;
95//End global variables
96
97//testing
98void changeSize1(int w, int h) {
99
100        // Prevent a divide by zero, when window is too short
101        // (you cant make a window of zero width).
102        if(h == 0)
103                h = 1;
104
105        // we're storing these values for latter use in the
106        // mouse motion functions
107        width = w;
108        height = h;
109        float ratio = (GLfloat) w / (GLfloat)h;
110
111        // Reset the coordinate system before modifying
112        glMatrixMode(GL_PROJECTION);
113        glLoadIdentity();
114       
115        // Set the viewport to be the entire window
116    glViewport(0, 0, w, h);
117
118        // Set the correct perspective.
119        gluPerspective(30,ratio,0.1,100.0);
120        glMatrixMode(GL_MODELVIEW);
121        glLoadIdentity();
122}
123
124
125//Functonal to use when the window is resized
126void changeSize2(int w, int h)
127{
128
129        if(h == 0)
130                h = 1;
131
132        float ratio = (GLfloat) w / (GLfloat)h;
133
134        glMatrixMode(GL_PROJECTION);
135        glLoadIdentity();
136        gluPerspective(60,ratio,0.01,100);
137
138        glMatrixMode(GL_MODELVIEW);
139        glLoadIdentity();
140
141        glViewport(0, 0, w, h);
142
143}
144
145//Keyboard Processing
146void processNormalKeys(unsigned char key, int x, int y)
147{
148
149        if (key == 27) exit(0);
150        else if (key=='1') modeDirect = ((modeDirect == 1.0)? 0.0:1.0);
151        else if (key == '2') modeIndirect = ((modeIndirect == 1.0)? 0.0:1.0);
152        else if (key == '3') modeAmbient = ((modeAmbient == 1.0)? 0.0:1.0);
153        else if (key == '4') modeLight = ((modeLight == 1.0)? 0.0:1.0);
154        else if (key == 'z') factor -= factorinc;
155        else if (key == 'x') factor += factorinc;
156        else if (key == 'c') angle--;
157        else if (key == 'v') angle++;
158        else if (key == 'q') intensityr += intensityinc;
159        else if (key == 'w') intensityg += intensityinc;
160        else if (key == 'e') intensityb += intensityinc;
161        else if (key == 'a') intensityr -= intensityinc;
162        else if (key == 's') intensityg -= intensityinc;
163        else if (key == 'd') intensityb -= intensityinc;
164        else if (key == 'r')
165        {
166                intensityr += intensityinc;
167                intensityg += intensityinc;
168                intensityb += intensityinc;
169        }
170        else if (key == 'f')
171        {
172                intensityr -= intensityinc;
173                intensityg -= intensityinc;
174                intensityb -= intensityinc;
175        }       
176       
177        else if (key == 'u') lightr += lightinc;
178        else if (key == 'h') lightg += lightinc;
179        else if (key == 'i') lightb += lightinc;
180        else if (key == 'j') lightr -= lightinc;
181        else if (key == 'o') lightg -= lightinc;
182        else if (key == 'k') lightb -= lightinc;
183        else if (key == 'p')
184        {
185                lightr += lightinc;
186                lightg += lightinc;
187                lightb += lightinc;
188        }
189        else if (key == 'l')
190        {
191                lightr -= lightinc;
192                lightg -= lightinc;
193                lightb -= lightinc;
194        };
195
196        if(lightr < 0.0) lightr = 0.0;
197        if(lightg < 0.0) lightg = 0.0;
198        if(lightb < 0.0) lightb = 0.0;
199
200        printf("\nDirect: %1.0f Indirect: %1.0f Ambient: %1.0f Factor: %1.1f Angle: %1.0f",modeDirect,modeIndirect,modeAmbient,factor,angle);
201}
202
203void init(int numargs, char **argv)
204{
205        //->vcVrmlLoaderLoadFile("tricicle.wrl", &vcO);
206
207        int err, i, j;
208        int qualitat = 1;
209        int resX = 256 * pow(2,qualitat-1), resY = 256 * pow(2,qualitat-1);
210        int RX = 512;
211        int RY = 512;
212
213        ObscuranceMap = new float[resX * resY * 4];
214        printf("\nAbans: ResolucioX = %d , ResolucioY = %d", resX, resY);
215
216        err = vcObscurerGenerateImage(geom, numargs, argv, qualitat, &resX, &resY, &ObscuranceMap);
217
218        printf("\nx = %f, y = %f, z = %f\n", geom.m_pObject._geo[0]._triSet[0]._ver[0], geom.m_pObject._geo[0]._triSet[0]._ver[1], geom.m_pObject._geo[0]._triSet[0]._ver[2]);
219
220        printf("\nDespres: ResolucioX = %d , ResolucioY = %d", resX, resY);
221
222//      GLubyte *Obscurance= new GLubyte[resX * resY * 4];
223//      for(int s = 0; s < resX * resY * 4; s++) Obscurance[s] = (GLubyte) ObscuranceMap[s];
224
225        m_pSpotlight = new float[RX * RY * 4];
226
227        for(i = 0; i<RX; i++)
228        {
229                for(j = 0; j<RY; j++)
230                {
231                        if((i-RX/2.0)*(i-RX/2.0)+(j-RY/2.0)*(j-RY/2.0)>RX*RY/5.0)
232                        {
233                                m_pSpotlight[4*(i*RY+j)] = 0.0;
234                                m_pSpotlight[4*(i*RY+j)+1] = 0.0;
235                                m_pSpotlight[4*(i*RY+j)+2] = 0.0;
236                                m_pSpotlight[4*(i*RY+j)+3] = 1.0;
237                        }
238                        else
239                        {
240                                m_pSpotlight[4*(i*RY+j)] = 1.0;
241                                m_pSpotlight[4*(i*RY+j)+1] = 1.0;
242                                m_pSpotlight[4*(i*RY+j)+2] = 1.0;
243                                m_pSpotlight[4*(i*RY+j)+3] = 1.0;
244                        }
245                }
246        }               
247
248        //Create Textures.
249        glGenTextures(2, &texNam[0]);                                   // Create The Textures
250
251        //Texture
252        // Binding
253        glBindTexture( GL_TEXTURE_2D, texNam[0] );
254        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, resX, resY, 0, GL_RGBA, GL_FLOAT, ObscuranceMap);
255        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
256        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
257        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
258        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
259
260        glBindTexture( GL_TEXTURE_2D, texNam[1] );
261        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA_FLOAT32_ATI, RX, RY, 0, GL_RGBA, GL_FLOAT, m_pSpotlight);
262        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
263        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
264        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
265        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
266
267        glGenFramebuffersEXT(1, &fb);
268        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb);
269
270        glGenTextures(1,&texFBO[0]);
271
272        glBindTexture( GL_TEXTURE_2D, texFBO[0] );
273        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA_FLOAT32_ATI, RX, RY, 0, GL_RGBA, GL_FLOAT, 0);
274        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
275        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
276        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
277        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
278
279        glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, texFBO[0],0);
280
281        glGenRenderbuffersEXT(1, &texFBO[1]);
282        glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, texFBO[1]);
283        glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT24, RX, RY );
284        glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, texFBO[1]);
285
286        //We unbind the texture.
287        glBindTexture(GL_TEXTURE_2D, 0);
288        //We set the rendering context to render to the backbuffer again
289        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
290
291        //GLSL
292        //Depth Shaders
293        char *vsDepth = NULL, *fsDepth = NULL;
294       
295        vDepth = glCreateShader(GL_VERTEX_SHADER);
296        fDepth = glCreateShader(GL_FRAGMENT_SHADER);
297       
298
299        vsDepth = textFileRead("depth.vert");
300        fsDepth = textFileRead("depth.frag");
301       
302        const char *vvDepth = vsDepth;
303        const char *ffDepth = fsDepth;
304
305        glShaderSource(vDepth, 1, &vvDepth, NULL);
306        glShaderSource(fDepth, 1, &ffDepth, NULL);
307
308        free(vsDepth); free(fsDepth);
309
310        glCompileShader(vDepth);
311        glCompileShader(fDepth);
312
313        pDepth = glCreateProgram();
314        glAttachShader(pDepth, vDepth);
315        glAttachShader(pDepth, fDepth);
316
317        glLinkProgram(pDepth);
318
319        glUseProgram(pDepth);
320        locAngle = glGetUniformLocation(pDepth, "angle");
321        glUseProgram(0);
322
323        //Render Shaders
324        char *vsRender = NULL, *fsRender = NULL;
325       
326        vRender = glCreateShader(GL_VERTEX_SHADER);
327        fRender = glCreateShader(GL_FRAGMENT_SHADER);
328
329        vsRender = textFileRead("render.vert");
330        fsRender = textFileRead("render.frag");
331       
332        const char *vvRender = vsRender;
333        const char *ffRender = fsRender;
334
335        glShaderSource(vRender, 1, &vvRender, NULL);
336        glShaderSource(fRender, 1, &ffRender, NULL);
337
338        free(vsRender); free(fsRender);
339
340        glCompileShader(vRender);
341        glCompileShader(fRender);
342
343        pRender = glCreateProgram();
344        glAttachShader(pRender, vRender);
345        glAttachShader(pRender, fRender);
346
347        glLinkProgram(pRender);
348
349        glUseProgram(pRender);
350        ProjParam0              = glGetUniformLocation(pRender, "projMatrix");
351        Time0                   = glGetUniformLocation(pRender, "time");
352        texture0                = glGetUniformLocation(pRender, "texture");
353        texture20               = glGetUniformLocation(pRender, "shadowMap");
354        texture30               = glGetUniformLocation(pRender, "spotlight");
355        kd0                             = glGetUniformLocation(pRender, "Kd");
356        lpos0                   = glGetUniformLocation(pRender, "LightPos");
357        ModeDirect0                     = glGetUniformLocation(pRender, "modeDirect");
358        ModeIndirect0           = glGetUniformLocation(pRender, "modeIndirect");
359        ModeAmbient0            = glGetUniformLocation(pRender, "modeAmbient");
360        AmbientIntensity0       = glGetUniformLocation(pRender, "intensity");
361        LightPower0             = glGetUniformLocation(pRender, "lpower");
362        Factor0         = glGetUniformLocation(pRender, "factor");
363        LightMap0               = glGetUniformLocation(pRender, "modeLight");
364        glUseProgram(0);
365        //End GLSL
366       
367        //->geom.LoadMesh(numargs, argv);       
368
369        for(i = 0; i<geom.m_pObject._numGeos;i++)
370        {
371                for(j = 0; j<geom.m_pObject._geo[i]._numTriSets;j++)
372                {
373                        //Aqui creeem els VBOs.
374
375                        // Generate And Bind The Index Buffer
376                        glGenBuffersARB( 1, (unsigned int *)&geom.m_pObject._geo[i]._triSet[j].m_nVBOIndexs );                                  // Get A Valid Name
377                        glBindBufferARB( GL_ARRAY_BUFFER_ARB, geom.m_pObject._geo[i]._triSet[j].m_nVBOIndexs );                 // Bind The Buffer
378                        // Load The Data
379                        glBufferDataARB( GL_ARRAY_BUFFER_ARB, geom.m_pObject._geo[i]._triSet[j]._numTris * 3 * sizeof(int), geom.m_pObject._geo[i]._triSet[j]._index, GL_STATIC_DRAW_ARB );
380
381                        // Generate And Bind The Vertex Buffer
382                        glGenBuffersARB( 1, &geom.m_pObject._geo[i]._triSet[j].m_nVBOVertices );                        // Get A Valid Name
383                        glBindBufferARB( GL_ARRAY_BUFFER_ARB, geom.m_pObject._geo[i]._triSet[j].m_nVBOVertices );                       // Bind The Buffer
384                        // Load The Data
385                        glBufferDataARB( GL_ARRAY_BUFFER_ARB, geom.m_pObject._geo[i]._triSet[j]._numVer * 3 * sizeof(float), geom.m_pObject._geo[i]._triSet[j]._ver, GL_STATIC_DRAW_ARB );
386
387
388                        // Generate And Bind The Normal Buffer
389                        glGenBuffersARB( 1, &geom.m_pObject._geo[i]._triSet[j].m_nVBONormals );                 // Get A Valid Name
390                        glBindBufferARB( GL_ARRAY_BUFFER_ARB, geom.m_pObject._geo[i]._triSet[j].m_nVBONormals );                        // Bind The Buffer
391                        // Load The Data
392                        glBufferDataARB( GL_ARRAY_BUFFER_ARB, geom.m_pObject._geo[i]._triSet[j]._numVer * 3 * sizeof(float), geom.m_pObject._geo[i]._triSet[j]._nor, GL_STATIC_DRAW_ARB );
393
394                        // Generate And Bind The TexCoord Buffer
395                        glGenBuffersARB( 1, &geom.m_pObject._geo[i]._triSet[j].m_nVBOTexCoords );                       // Get A Valid Name
396                        glBindBufferARB( GL_ARRAY_BUFFER_ARB, geom.m_pObject._geo[i]._triSet[j].m_nVBOTexCoords );                      // Bind The Buffer
397                        // Load The Data
398                        glBufferDataARB( GL_ARRAY_BUFFER_ARB, geom.m_pObject._geo[i]._triSet[j]._numVer * 2 * sizeof(float), geom.m_pObject._geo[i]._triSet[j]._tex, GL_STATIC_DRAW_ARB );
399
400                        // Generate And Bind The Color Buffer
401                        glGenBuffersARB( 1, &geom.m_pObject._geo[i]._triSet[j].m_nVBOColors );                  // Get A Valid Name
402                        glBindBufferARB( GL_ARRAY_BUFFER_ARB, geom.m_pObject._geo[i]._triSet[j].m_nVBOColors );                 // Bind The Buffer
403                        // Load The Data
404                        glBufferDataARB( GL_ARRAY_BUFFER_ARB, geom.m_pObject._geo[i]._triSet[j]._numVer * 3 * sizeof(float), geom.m_pObject._geo[i]._triSet[j]._refl, GL_STATIC_DRAW_ARB );
405                }
406        }       
407        glBindBufferARB( GL_ARRAY_BUFFER_ARB, 0 );                      // Bind The Buffer
408}
409
410void renderDepth()
411{
412        glUseProgram(pDepth);
413
414        Esf.center.x = 0.0;
415        Esf.center.y = 0.0;
416        Esf.center.z = 0.0;
417        Esf.radius = sqrt(12.0)/2.0;
418
419        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fb);
420
421                glClearDepth(1.0);
422                glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
423                glEnable (GL_DEPTH_TEST);                                                                       // Enable Depth Testing
424                glDepthFunc(GL_LESS);
425
426                glMatrixMode(GL_PROJECTION);   
427                glLoadIdentity();
428                gluPerspective(40.0f, 1.0f, 1.0f, (Esf.radius * 2.0)+1.0);
429                glGetFloatv(GL_PROJECTION_MATRIX,project);
430
431                glMatrixMode(GL_MODELVIEW);
432                glLoadIdentity();
433                gluLookAt( (Esf.radius+1.0) * cos(angle/50.0), (Esf.radius+1.0) * sin(angle/50.0) , 1.0,
434                                        Esf.center.x, Esf.center.y, Esf.center.z,
435                                        0.0f, 1.0f, 0.0f);
436                glGetFloatv(GL_MODELVIEW_MATRIX,mview);
437
438                glViewport(0,0,512.0,512.0);
439
440                glUniform1f(locAngle, angle);
441
442        // Enable Pointers
443        glEnableClientState( GL_VERTEX_ARRAY );                                         // Enable Vertex Arrays
444
445        for(int i=0; i<geom.m_pObject._numGeos;i++)
446        {
447                for(int j=0; j<geom.m_pObject._geo[i]._numTriSets;j++)
448                {
449                        // Set Pointers To Our Data
450                        glBindBufferARB( GL_ARRAY_BUFFER_ARB, geom.m_pObject._geo[i]._triSet[j].m_nVBOVertices );
451                        glVertexPointer( 3, GL_FLOAT, 0, (char *) NULL );               // Set The Vertex Pointer To The Vertex Buffer
452                        glBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, geom.m_pObject._geo[i]._triSet[j].m_nVBOIndexs );
453
454                        glDrawElements( GL_TRIANGLES, geom.m_pObject._geo[i]._triSet[j]._numTris * 3,GL_UNSIGNED_INT,BUFFER_OFFSET(0) );        // Draw All Of The Quads At Once
455                        //->glDrawElements( GL_TRIANGLES, geom.m_pObject._geo[i]._triSet[j]._numTris*3,GL_UNSIGNED_INT,BUFFER_OFFSET(0) );      // Draw All Of The Quads At Once
456                }
457        }
458               
459        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
460
461        glUseProgram(0);
462}
463
464//Render the Scene
465void renderScene(void)
466{
467        renderDepth();
468
469        glUseProgram(pRender);
470
471        changeSize2(512, 512);
472
473        glLoadIdentity();
474
475        glTranslatef(0,0,-zoom);
476        glTranslatef(tx,ty,0);
477        glRotatef(rotx,1,0,0);
478        glRotatef(roty,0,1,0); 
479        glRotatef(90.0f, 0.0f, 0.0f, 1.0f);
480
481        glClearColor(1.0,1.0,1.0,1.0);
482        glClearDepth(1.0);
483
484        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
485
486        glViewport(0,0,512*2,512*2);
487
488        textureMatrix = biasMatrix * project * mview;
489
490        glMatrixMode(GL_TEXTURE);
491        glLoadIdentity();
492        glMultMatrixf(textureMatrix);
493
494        glEnable(GL_CULL_FACE);
495
496        glUniform1f(Time0, angle);
497        glUniform1f(ModeDirect0, modeDirect);
498        glUniform1f(ModeIndirect0, modeIndirect);
499        glUniform1f(ModeAmbient0, modeAmbient);
500        glUniform1f(LightMap0, modeLight);
501        glUniform3f(kd0, 0.5,0.5,0.5);
502        glUniform3f(AmbientIntensity0, intensityr,intensityg,intensityb);
503        glUniform3f(LightPower0, lightr,lightg,lightb);
504        glUniform3f(Factor0, factor,factor,factor);
505        glUniform3f(lpos0, (Esf.radius+1.0) * cos(angle/50), (Esf.radius+1.0) * sin(angle/50), 1.0);
506        glUniformMatrix4fv(ProjParam0, 1, GL_FALSE, textureMatrix);
507        glActiveTexture(GL_TEXTURE0);
508        glBindTexture(GL_TEXTURE_2D, texNam[0]);
509        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
510        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
511        glUniform1i(texture0, 0);
512        glActiveTexture(GL_TEXTURE1);
513        glBindTexture(GL_TEXTURE_2D, texFBO[0]);
514        glUniform1i(texture20, 1);
515        glActiveTexture(GL_TEXTURE2);
516        glBindTexture(GL_TEXTURE_2D, texNam[1]);
517        glUniform1i(texture30,2);
518        glActiveTexture(GL_TEXTURE0);
519
520        // Get FPS
521        if( GetTickCount() - g_dwLastFPS >= 1000 )                                      // When A Second Has Passed...
522        {
523                g_dwLastFPS = GetTickCount();                                                   // Update Our Time Variable
524                g_nFPS = g_nFrames;                                                                             // Save The FPS
525                g_nFrames = 0;                                                                                  // Reset The FPS Counter
526
527                char szTitle[256]={0};                                                                  // Build The Title String
528                sprintf( szTitle, "Obscurances: Nicolau i Sergi - %d FPS", g_nFPS );
529                glutSetWindowTitle(szTitle);
530        }
531        g_nFrames++;                                                                                            // Increment Our FPS Counter
532
533       
534        // Enable Pointers
535        glEnableClientState( GL_VERTEX_ARRAY );                                         // Enable Vertex Arrays
536        glEnableClientState( GL_TEXTURE_COORD_ARRAY );                          // Enable Texture Coord Arrays
537        glEnableClientState( GL_COLOR_ARRAY );
538        glEnableClientState( GL_NORMAL_ARRAY );
539
540                        for(int i=0; i<geom.m_pObject._numGeos;i++)
541                        {
542                                for(int j=0; j<geom.m_pObject._geo[i]._numTriSets;j++)
543                                {
544                                        // Set Pointers To Our Data
545                                        glBindBufferARB( GL_ARRAY_BUFFER_ARB, geom.m_pObject._geo[i]._triSet[j].m_nVBOVertices );
546                                        glVertexPointer( 3, GL_FLOAT, 0, (char *) NULL );               // Set The Vertex Pointer To The Vertex Buffer
547                                        glBindBufferARB( GL_ARRAY_BUFFER_ARB, geom.m_pObject._geo[i]._triSet[j].m_nVBOColors );
548                                        glColorPointer( 3, GL_FLOAT, 0, (char *) NULL );                // Set The Vertex Pointer To The Vertex Buffer
549                                        glBindBufferARB( GL_ARRAY_BUFFER_ARB, geom.m_pObject._geo[i]._triSet[j].m_nVBOTexCoords );
550                                        glTexCoordPointer( 2, GL_FLOAT, 0, (char *) NULL );             // Set The TexCoord Pointer To The TexCoord Buffer
551                                        glBindBufferARB( GL_ARRAY_BUFFER_ARB, geom.m_pObject._geo[i]._triSet[j].m_nVBONormals );
552                                        glNormalPointer( GL_FLOAT, 0, (char *) NULL );          // Set The TexCoord Pointer To The TexCoord Buffer
553                                        glBindBufferARB( GL_ELEMENT_ARRAY_BUFFER_ARB, geom.m_pObject._geo[i]._triSet[j].m_nVBOIndexs );
554
555                                        glDrawElements( GL_TRIANGLES, geom.m_pObject._geo[i]._triSet[j]._numTris * 3, GL_UNSIGNED_INT,BUFFER_OFFSET(0) );       // Draw All Of The Quads At Once
556                                }
557                        }
558        // Disable Pointers
559        glDisableClientState( GL_VERTEX_ARRAY );                                        // Disable Vertex Arrays
560        glDisableClientState( GL_TEXTURE_COORD_ARRAY );                         // Disable Texture Coord Arrays
561        glDisableClientState( GL_COLOR_ARRAY );
562        glDisableClientState( GL_NORMAL_ARRAY );
563
564        glUseProgram(0);
565
566        glutSwapBuffers();
567}
568
569
570void Motion(int x,int y)
571{
572        int diffx=x-lastx;
573        int diffy=y-lasty;
574        lastx=x;
575        lasty=y;
576
577        if( Buttons[2] )
578        {
579                zoom -= (float) 0.05f * diffx;
580        }
581        else
582                if( Buttons[0] )
583                {
584                        rotx += (float) 0.5f * diffy;
585                        roty += (float) 0.5f * diffx;           
586                }
587                else
588                        if( Buttons[1] )
589                        {
590                                tx += (float) 0.05f * diffx;
591                                ty -= (float) 0.05f * diffy;
592                        }
593                        glutPostRedisplay();
594}
595
596void Mouse(int b,int s,int x,int y)
597{
598        lastx=x;
599        lasty=y;
600        switch(b)
601        {
602        case GLUT_LEFT_BUTTON:
603                if (GLUT_DOWN == s) Buttons[0] = 1;
604                else Buttons[0] = 0;
605                break;
606        case GLUT_MIDDLE_BUTTON:
607                if (GLUT_DOWN == s) Buttons[1] = 1;
608                else Buttons[1] = 0;
609                break;
610        case GLUT_RIGHT_BUTTON:
611                if (GLUT_DOWN == s) Buttons[2] = 1;
612                else Buttons[2] = 0;
613                break;
614        default:
615                break;         
616        }
617        glutPostRedisplay();
618}
619
620IMPLEMENT_APP(Main)
621
622BEGIN_EVENT_TABLE(Main,wxApp)
623                EVT_IDLE(Main::OnIdle) 
624END_EVENT_TABLE()
625
626bool Main::OnInit()
627{
628        //Inicializem els handlers per tractar amb imatges
629        wxInitAllImageHandlers();
630
631        //Creem el Frame Principal del GUI
632    frame = new MyFrame("Generate GPU Obscurances",50,50,800,600);
633        frame->Show(true);
634        SetTopWindow(frame);
635
636    return true;
637}
638
639void Main::OnIdle(wxIdleEvent& event)
640{
641    //Obtenim els resultats dels Views (estaran en threads?)
642        //... ids de textura
643
644    //wake up idle:
645    wxWakeUpIdle();
646
647    event.Skip(); // normal processing
648}
649
650
651//Main Program
652/*->void main(int argc, char **argv)
653{
654
655        modeDirect = 0.0;
656        modeIndirect = 0.0;
657        modeAmbient = 0.0;
658
659        glutInit(&argc, argv);
660
661        glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
662
663        glutInitWindowPosition(100,100);
664        glutInitWindowSize(1024,1024);
665        glutCreateWindow("Test Pbuffer");
666        glutReshapeFunc(changeSize1);
667
668        GLenum err = glewInit();
669       
670        glutDisplayFunc(renderScene);
671
672        glutIdleFunc(renderScene);
673
674        glutMouseFunc(Mouse);
675        glutMotionFunc(Motion);
676
677        glutIgnoreKeyRepeat(1);
678        glutKeyboardFunc(processNormalKeys);
679
680        init(argc, argv);
681
682        glutMainLoop();
683}*/
Note: See TracBrowser for help on using the repository browser.