Hi i am trying to use tessellation in opengl in order to draw concave polygons through JNI calls. As regards tessellation the shape is perfectly drawn however i tried to map a texture on to it rather than just fill it with a solid colour however the shape is just white there is no texture onto it. Do you have any hints about this or maybe links to a tutorial using textures with tessellations? I enclosed the code below:
void create_tessellator()
{
//create new tesselator object
tess = gluNewTess();
//register call back functions
gluTessCallback(tess, GLU_TESS_BEGIN, glBegin);
gluTessCallback(tess, GLU_TESS_END, glEnd);
gluTessCallback(tess, GLU_TESS_VERTEX, glVertex3dv);
}
void CALLBACK vertexCallback(GLvoid *vertexdata)
{
struct vertexData * pointer;
GLfloat xmin, xmax, ymin, ymax,xrange,yrange,xcoor, ycoor;
pointer = (struct vertexData *) vertexdata;
//printf("value is: %f
",((GLdouble) (pointer->vertex) ));
xmin = pointer->xmin;
ymin = pointer->ymin;
xrange = pointer->xrange;
yrange = pointer->yrange;
xcoor = (*((GLdouble*)(pointer->vertex))-xmin)/xrange;
ycoor = (*( (GLdouble*)(pointer->vertex) + 1)-ymin)/yrange;
printf("*************
value of x: %f y:%f
", ((GLdouble)(pointer->vertex)), ((GLdouble)(pointer->vertex)+1));
printf("xcoor=%f ycoor=%f
",xcoor,ycoor);
glEnable(GL_TEXTURE_2D);
//using the texture
glBindTexture(GL_TEXTURE_2D, texName);
//setting parameters for the texture environment (how it will replace the surface values with the taxture values)
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTexCoord2f((GLfloat)xcoor,(GLfloat) ycoor);
glVertex3dv(pointer->vertex);
}
JNIEXPORT void JNICALL Java_DrawingFrame_polygonCB
(JNIEnv env, jobject canvas, jfloat xstart, jfloat ystart, jint brop2, jint fillmode, jint colr, jint colg, jint colb, jint numdelta, jdoubleArray deltaentries)
{
float xmin,ymin,xmax, ymax, xrange, yrange;
struct vertexData vdata;
struct vertexData vdataptr;
if (tess == NULL)
create_tessellator(); //tesselator has to be created only nce for all the shapes that need to be drawn
gluTessCallback(tess, GLU_TESS_VERTEX, vertexCallback);
texinit(1, 1, 255,0, 0,0, 255, 0);
if (tess == NULL)
create_tessellator(); //tesselator has to be created only nce for all the shapes that need to be drawn
jdouble* data = (*env)->GetDoubleArrayElements(env, deltaentries, 0);
// define concave quad with a hole as the one below as example
// 1----------2
// | 7----6 |
// | | | |
// | /4----5 |
// 0/---------3
//glEnable(GL_COLOR_LOGIC_OP);
//glLogicOp(brop2);
GLdouble points[numdelta][3];
for(int i=0;i<=numdelta-2;i+=2)
{
if(i==0)
{
xmin = *data;
xmax = *data;
}
else
{
if(*(data + i) < xmin)
xmin = *(data + i);
if(*(data + i) > xmax)
xmax = *(data + i);
}
}
for(int i=1;i<=numdelta-1;i+=2)
{
if(i==1)
{
ymin = *data;
ymax = *data;
}
else
{
if(*(data + i) < ymin)
ymin = *(data + i);
if(*(data + i) > ymax)
ymax = *(data + i);
}
}
//printf("xmin: %f xmax: %f ymin: %f ymax: %f
", xmin, xmax, ymin, ymax);
xrange = xmax - xmin;
yrange = ymax - ymin;
printf("fillmode= %d
", fillmode);
gluTessProperty(tess, GLU_TESS_WINDING_RULE,
fillmode == 1 ?GLU_TESS_WINDING_ODD:GLU_TESS_WINDING_NONZERO);
//glColor3ub(colr, colg, colb);
gluTessBeginPolygon(tess, NULL); // with NULL data
gluTessBeginContour(tess); // outer quad
for (int i = 0; i < numdelta ; i+=2)
{
points[i][0] = *(data +i);
points[i][1] = *(data +i+1);
points[i][2] = 0;
vdataptr = malloc(sizeof(struct vertexData));
vdataptr->vertex = points[i];
vdataptr->xmin = xmin;
vdataptr->ymin = ymin;
vdataptr->xrange = xrange;
vdataptr->yrange = yrange;
printf("1:%f 2:%f 3:%f
", points[i][0], points[i][1],points[i][2]);
gluTessVertex(tess, points[i],vdataptr);
}
gluTessEndContour(tess);
gluTessEndPolygon(tess);
//glDisable(GL_COLOR_LOGIC_OP);
}