Hello
I am now compling a project, but in one source file of this project, I met
this problem. It seems very strange.
Below is this source file:
----------------------------------------
#include "icarus_types.h "
#ifdef WIN32
#include <GL/glu.h>
#include <GL/glext.h>
extern PFNGLCONVOLUTIO NFILTER2DPROC glConvolutionFi lter2D;
extern PFNGLCONVOLUTIO NPARAMETERIPROC glConvolutionPa rameteri;
#endif
extern Form *form;
extern Project *project;
extern psRand myrand;
extern int can_convolve;
SpecularPatch:: SpecularPatch(P atch *patch, int i0, int i1, int i2)
{
this->index[0]= i0;
this->index[1]= i1;
this->index[2]= i2;
// sum radiance
this->L[0]= patch->E[0]+patch->B[0];
this->L[1]= patch->E[1]+patch->B[1];
this->L[2]= patch->E[2]+patch->B[2];
}
SpecularPatch:: ~SpecularPatch( )
{
}
void Project::buildS pecularEnvironm ent()
{
Octree *octree;
OctreeVertex *ov;
Object *obj;
int face;
Patch *patch;
SpecularPatch *spatch;
int i,j,i0,i1,i2;
// count max vertices and patches
i= 0;
this->num_specular_p atches= 0;
for (obj= this->objects; obj; obj= obj->next)
for (face= 0; face< obj->num_faces; face++)
{
this->num_specular_p atches += obj->faces[face].num_patches;
i += 3*obj->faces[face].num_patches;
}
// initialise
this->specular_patch es=
(SpecularPatch* *)calloc(this->num_specular_p atches,sizeof(S pecularPatch*)) ;
this->specular_index _array= (unsigned
int*)calloc(thi s->num_specular_p atches*3,sizeof (unsigned int));
// allocate octree vertex storage
octree= new Octree(this->bb.min,this->bb.max,i);
// place all patch vertices into an octree
this->num_specular_p atches= 0;
int k= 0;
for (obj= this->objects; obj; obj= obj->next)
for (face= 0; face< obj->num_faces; face++)
for (i= 0; i< obj->faces[face].num_patches; i++)
{
patch= obj->faces[face].patches[i];
// insert vertices into the octree
i0= octree->addVertex(patc h->vertex[0],patch->normal,0,0,0,0 );
i1= octree->addVertex(patc h->vertex[1],patch->normal,0,0,0,0 );
i2= octree->addVertex(patc h->vertex[2],patch->normal,0,0,0,0 );
// make a new specular patch
spatch= new SpecularPatch(p atch,i0,i1,i2);
this->specular_patch es[this->num_specular_p atches++]= spatch;
// store indices
this->specular_index _array[k++]= i0;
this->specular_index _array[k++]= i1;
this->specular_index _array[k++]= i2;
}
// allocate specular vertex storage
this->num_specular_v ertices= octree->num_vertices ;
this->specular_radia nces=
(SpecularRadian ce*)calloc(this->num_specular_v ertices,sizeof( SpecularRadianc e));
this->specular_verti ces=
(SpecularVertex *)calloc(this->num_specular_v ertices,sizeof( SpecularVertex) );
// store data
for (i= 0; i< this->num_specular_v ertices; i++)
{
// fetch octree vertex
ov= octree->vertices[i];
// make a new specular vertex
this->specular_verti ces[i].pos= VectorSet(ov->x,ov->y,ov->z);
this->specular_verti ces[i].col[0]= (unsigned char)(myrand.ra nd(255));
this->specular_verti ces[i].col[1]= (unsigned char)(myrand.ra nd(255));
this->specular_verti ces[i].col[2]= (unsigned char)(myrand.ra nd(255));
this->specular_verti ces[i].col[3]= 255;
}
// delete the octree
delete octree;
for (j= 0; j< this->num_specular_p atches; j++)
{
spatch= this->specular_patch es[j];
// average patch radiance at vertices
for (i= 0; i< 3; i++)
{
this->specular_radia nces[spatch->index[i]].L[0] += spatch->L[0];
this->specular_radia nces[spatch->index[i]].L[1] += spatch->L[1];
this->specular_radia nces[spatch->index[i]].L[2] += spatch->L[2];
this->specular_radia nces[spatch->index[i]].count++;
}
// calculate surface normal
spatch->normal=
VectorNormalize (VectorCrossPro duct(VectorSub( this->specular_verti ces[spatch->index[1]].pos,this->specular_verti ces[spatch->index[0]].pos),VectorSub (this->specular_verti ces[spatch->index[2]].pos,this->specular_verti ces[spatch->index[0]].pos)));
}
for (i= 0; i< this->num_specular_v ertices; i++)
if (this->specular_radia nces[i].count > 0)
{
this->specular_radia nces[i].L[0] /=
(float)(M_PI*th is->specular_radia nces[i].count);
this->specular_radia nces[i].L[1] /=
(float)(M_PI*th is->specular_radia nces[i].count);
this->specular_radia nces[i].L[2] /=
(float)(M_PI*th is->specular_radia nces[i].count);
}
}
static void setMat(Vector right, Vector up, Vector view, Vector eye)
{
float mat[16];
mat[0]= right.x;
mat[1]= up.x;
mat[2]= view.x;
mat[3]= 0.0;
mat[4]= right.y;
mat[5]= up.y;
mat[6]= view.y;
mat[7]= 0.0;
mat[8]= right.z;
mat[9]= up.z;
mat[10]= view.z;
mat[11]= 0.0;
mat[12]= 0.0;
mat[13]= 0.0;
mat[14]= 0.0;
mat[15]= 1.0;
glLoadMatrixf(m at);
glTranslatef(-eye.x, -eye.y, -eye.z);
}
//#define __DUMP
void Frame::buildEnv Maps()
{
if (project->model_type!=MO DEL_ILLUMINATIO N &&
project->model_type!=MO DEL_RTT_ILL) return;
Material *mat;
int i,j;
float mvm[16];
Instance *inst;
// loop over each instance
for (j= 0, inst= project->instances; inst; j++, inst= inst->next)
if (inst->bti)
{
glEnable(GL_CUL L_FACE);
glCullFace(GL_B ACK);
glDisable(GL_LI GHTING);
glClearColor(0, 0,0,0);
// prepare projection
glMatrixMode(GL _PROJECTION);
glPushMatrix();
glLoadIdentity( );
gluPerspective( 90.0, 1.0, 0.01, 100.0);
glMatrixMode(GL _MODELVIEW);
glPushMatrix();
glPushAttrib(GL _VIEWPORT_BIT);
glViewport(0,0, _ENVMAP_SIZE,_E NVMAP_SIZE);
// loop over each specular material
for (i= 0; i< inst->prim->num_material s; i++)
if (inst->bti[i] > 0)
{
mat= inst->prim->materials[i];
glMatrixMode(GL _MODELVIEW);
glGetFloatv(GL_ MODELVIEW_MATRI X, mvm);
Vector right= VectorSet(mvm[0], mvm[4], mvm[8]);
Vector up= VectorSet(mvm[1], mvm[5], mvm[9]);
Vector view= VectorSet(mvm[2], mvm[6], mvm[10]);
Vector eye= inst->material_centr es[i];
glLoadIdentity( );
// tone-map the scene to match this material
project->toneMapSpecula r(this,mat);
// bind this texture map
glBindTexture(G L_TEXTURE_CUBE_ MAP_ARB, inst->bti[i]);
#define MAX_BLUR 8
// what's the filter size?
int filter_size;
if (mat->shi == 256.0)
filter_size= 0;
else
filter_size= (int)(MAX_BLUR* (1.0-mat->shi/256.0));
if (filter_size > 0)
{
if (filter_size > MAX_BLUR)
filter_size= MAX_BLUR;
// build an NxN convolution filter
int sz= filter_size*fil ter_size;
float *filter= (float*)malloc( sz*sizeof(float ));
for (int n= 0; n< sz; n++)
filter[n]= 1.0/(float)sz;
if (can_convolve)
{
glConvolutionFi lter2D(GL_CONVO LUTION_2D,GL_LU MINANCE,filter_ size,filter_siz e,GL_LUMINANCE, GL_FLOAT,filter );
glConvolutionPa rameteri(GL_CON VOLUTION_2D,GL_ CONVOLUTION_BOR DER_MODE,GL_REP LICATE_BORDER_H P);
}
glEnable(GL_CON VOLUTION_2D);
free(filter);
}
// draw each face
glClear(GL_COLO R_BUFFER_BIT | GL_DEPTH_BUFFER _BIT);
setMat(right, VectorScalar(up ,-1), VectorScalar(vi ew,-1), eye);
project->drawSpecular(i nst,mat);
glCopyTexSubIma ge2D(GL_TEXTURE _CUBE_MAP_POSIT IVE_Z_ARB, 0, 0, 0, 0,
0, _ENVMAP_SIZE,_E NVMAP_SIZE);
#ifdef __DUMP
{
glDisable(GL_CO NVOLUTION_2D);
unsigned char buf[4*_ENVMAP_SIZE* _ENVMAP_SIZE];
glReadPixels(0, 0,_ENVMAP_SIZE, _ENVMAP_SIZE,GL _RGBA,GL_UNSIGN ED_BYTE,buf);
FILE *f= fopen("m1.ppm", "w");
fprintf(f,"P6\n %d %d\n255\n",_ENV MAP_SIZE,_ENVMA P_SIZE);
for (int j= 0; j< _ENVMAP_SIZE*_E NVMAP_SIZE; j++)
{
unsigned char c= buf[4*j+0];
fwrite(&c,1,1,f );
c= buf[4*j+1];
fwrite(&c,1,1,f );
c= buf[4*j+2];
fwrite(&c,1,1,f );
}
fclose(f);
glEnable(GL_CON VOLUTION_2D);
}
#endif
glClear(GL_COLO R_BUFFER_BIT | GL_DEPTH_BUFFER _BIT);
setMat(VectorSc alar(right,-1), VectorScalar(up ,-1), view, eye);
project->drawSpecular(i nst,mat);
glCopyTexSubIma ge2D(GL_TEXTURE _CUBE_MAP_NEGAT IVE_Z_ARB, 0, 0, 0, 0,
0, _ENVMAP_SIZE,_E NVMAP_SIZE);
#ifdef __DUMP
{
glDisable(GL_CO NVOLUTION_2D);
unsigned char buf[4*_ENVMAP_SIZE* _ENVMAP_SIZE];
glReadPixels(0, 0,_ENVMAP_SIZE, _ENVMAP_SIZE,GL _RGBA,GL_UNSIGN ED_BYTE,buf);
FILE *f= fopen("m2.ppm", "w");
fprintf(f,"P6\n %d %d\n255\n",_ENV MAP_SIZE,_ENVMA P_SIZE);
for (int j= 0; j< _ENVMAP_SIZE*_E NVMAP_SIZE; j++)
{
unsigned char c= buf[4*j+0];
fwrite(&c,1,1,f );
c= buf[4*j+1];
fwrite(&c,1,1,f );
c= buf[4*j+2];
fwrite(&c,1,1,f );
}
fclose(f);
glEnable(GL_CON VOLUTION_2D);
}
#endif
glClear(GL_COLO R_BUFFER_BIT | GL_DEPTH_BUFFER _BIT);
setMat(view, VectorScalar(up ,-1), right, eye);
project->drawSpecular(i nst,mat);
glCopyTexSubIma ge2D(GL_TEXTURE _CUBE_MAP_NEGAT IVE_X_ARB, 0, 0, 0, 0,
0, _ENVMAP_SIZE,_E NVMAP_SIZE);
#ifdef __DUMP
{
glDisable(GL_CO NVOLUTION_2D);
unsigned char buf[4*_ENVMAP_SIZE* _ENVMAP_SIZE];
glReadPixels(0, 0,_ENVMAP_SIZE, _ENVMAP_SIZE,GL _RGBA,GL_UNSIGN ED_BYTE,buf);
FILE *f= fopen("m3.ppm", "w");
fprintf(f,"P6\n %d %d\n255\n",_ENV MAP_SIZE,_ENVMA P_SIZE);
for (int j= 0; j< _ENVMAP_SIZE*_E NVMAP_SIZE; j++)
{
unsigned char c= buf[4*j+0];
fwrite(&c,1,1,f );
c= buf[4*j+1];
fwrite(&c,1,1,f );
c= buf[4*j+2];
fwrite(&c,1,1,f );
}
fclose(f);
glEnable(GL_CON VOLUTION_2D);
}
#endif
glClear(GL_COLO R_BUFFER_BIT | GL_DEPTH_BUFFER _BIT);
setMat(VectorSc alar(view,-1), VectorScalar(up ,-1),
VectorScalar(ri ght,-1), eye);
project->drawSpecular(i nst,mat);
glCopyTexSubIma ge2D(GL_TEXTURE _CUBE_MAP_POSIT IVE_X_ARB, 0, 0, 0, 0,
0, _ENVMAP_SIZE,_E NVMAP_SIZE);
#ifdef __DUMP
{
glDisable(GL_CO NVOLUTION_2D);
unsigned char buf[4*_ENVMAP_SIZE* _ENVMAP_SIZE];
glReadPixels(0, 0,_ENVMAP_SIZE, _ENVMAP_SIZE,GL _RGBA,GL_UNSIGN ED_BYTE,buf);
FILE *f= fopen("m4.ppm", "w");
fprintf(f,"P6\n %d %d\n255\n",_ENV MAP_SIZE,_ENVMA P_SIZE);
for (int j= 0; j< _ENVMAP_SIZE*_E NVMAP_SIZE; j++)
{
unsigned char c= buf[4*j+0];
fwrite(&c,1,1,f );
c= buf[4*j+1];
fwrite(&c,1,1,f );
c= buf[4*j+2];
fwrite(&c,1,1,f );
}
fclose(f);
glEnable(GL_CON VOLUTION_2D);
}
#endif
glClear(GL_COLO R_BUFFER_BIT | GL_DEPTH_BUFFER _BIT);
setMat(right, VectorScalar(vi ew,-1), up, eye);
project->drawSpecular(i nst,mat);
glCopyTexSubIma ge2D(GL_TEXTURE _CUBE_MAP_NEGAT IVE_Y_ARB, 0, 0, 0, 0,
0, _ENVMAP_SIZE,_E NVMAP_SIZE);
#ifdef __DUMP
{
glDisable(GL_CO NVOLUTION_2D);
unsigned char buf[4*_ENVMAP_SIZE* _ENVMAP_SIZE];
glReadPixels(0, 0,_ENVMAP_SIZE, _ENVMAP_SIZE,GL _RGBA,GL_UNSIGN ED_BYTE,buf);
FILE *f= fopen("m5.ppm", "w");
fprintf(f,"P6\n %d %d\n255\n",_ENV MAP_SIZE,_ENVMA P_SIZE);
for (int j= 0; j< _ENVMAP_SIZE*_E NVMAP_SIZE; j++)
{
unsigned char c= buf[4*j+0];
fwrite(&c,1,1,f );
c= buf[4*j+1];
fwrite(&c,1,1,f );
c= buf[4*j+2];
fwrite(&c,1,1,f );
}
fclose(f);
glEnable(GL_CON VOLUTION_2D);
}
#endif
glClear(GL_COLO R_BUFFER_BIT | GL_DEPTH_BUFFER _BIT);
setMat(right, view, VectorScalar(up ,-1), eye);
project->drawSpecular(i nst,mat);
glCopyTexSubIma ge2D(GL_TEXTURE _CUBE_MAP_POSIT IVE_Y_ARB, 0, 0, 0, 0,
0, _ENVMAP_SIZE,_E NVMAP_SIZE);
#ifdef __DUMP
{
glDisable(GL_CO NVOLUTION_2D);
unsigned char buf[4*_ENVMAP_SIZE* _ENVMAP_SIZE];
glReadPixels(0, 0,_ENVMAP_SIZE, _ENVMAP_SIZE,GL _RGBA,GL_UNSIGN ED_BYTE,buf);
FILE *f= fopen("m6.ppm", "w");
fprintf(f,"P6\n %d %d\n255\n",_ENV MAP_SIZE,_ENVMA P_SIZE);
for (int j= 0; j< _ENVMAP_SIZE*_E NVMAP_SIZE; j++)
{
unsigned char c= buf[4*j+0];
fwrite(&c,1,1,f );
c= buf[4*j+1];
fwrite(&c,1,1,f );
c= buf[4*j+2];
fwrite(&c,1,1,f );
}
fclose(f);
glEnable(GL_CON VOLUTION_2D);
}
#endif
if (filter_size > 0)
glDisable(GL_CO NVOLUTION_2D);
}
glPopMatrix();
glMatrixMode(GL _PROJECTION);
glPopMatrix();
glMatrixMode(GL _MODELVIEW);
glPopAttrib();
}
}
void Project::toneMa pSpecular(Frame *fr, Material *mat)
{
int i;
float L[3];
float k;
// find specular scaling factor
k= 1.0/M_PI;
for (i= 0; i< this->num_specular_v ertices; i++)
{
// reflect radiance at the surface
L[0]= mat->spe[0]*k*this->specular_radia nces[i].L[0];
L[1]= mat->spe[1]*k*this->specular_radia nces[i].L[1];
L[2]= mat->spe[2]*k*this->specular_radia nces[i].L[2];
// tone-map
fr->img->toneMap(fr->img->method,fr->img->exptime,L,th is->specular_verti ces[i].col,true);
// gamma correct
this->specular_verti ces[i].col[0]=
this->gamma[this->specular_verti ces[i].col[0]];
this->specular_verti ces[i].col[1]=
this->gamma[this->specular_verti ces[i].col[1]];
this->specular_verti ces[i].col[2]=
this->gamma[this->specular_verti ces[i].col[2]];
}
}
----------------------------------------------------------------
It seems very well in linux complie enivronment(Tol d by my friends). But in
Visual Studio, after build it, it appears:
--------------------------------
Compiling...
icarus_specular .cpp
D:\cvs\icarus\r ender\icarus_sp ecular.cpp(8) : error C2146: syntax error :
missing ';' before identifier 'glConvolutionF ilter2D'
D:\cvs\icarus\r ender\icarus_sp ecular.cpp(8) : fatal error C1004: unexpected
end of file found
Error executing cl.exe.
icarus_specular .obj - 2 error(s), 0 warning(s)
-------------------------------------------------------
And after I add a header file "# include <GL/glew.h> "
the error appears as:
-------------------------------------
Compiling...
icarus_specular .cpp
D:\cvs\icarus\r ender\icarus_sp ecular.cpp(8) : warning C4273:
'__glewConvolut ionFilter2D' : inconsistent dll linkage. dllexport assumed.
D:\cvs\icarus\r ender\icarus_sp ecular.cpp(9) : warning C4273:
'__glewConvolut ionParameteri' : inconsistent dll linkage. dllexport
assumed.
D:\cvs\icarus\r ender\icarus_sp ecular.cpp(236) : error C2065:
'GL_REPLICATE_B ORDER_HP' : undeclared identifier
Error executing cl.exe.
icarus_specular .obj - 1 error(s), 2 warning(s)
-----------------------------------------------------
It is strange, becuase 'GL_REPLICATE_B ORDER_HP' has been defined in file
"GL/glext.h". And I have also included this header file.
I don't know why. Is it becuase the opengl library I added was not proper?
Or because something else? Something similar also happens in the other file.
I hope someone can give me some advice.
Cheers
yanwan