PDA

View Full Version : Selection buffer - depth probelm



Meryll
11-13-2010, 08:16 AM
Hi,
I am writing openGl viewer at the moment and everything is working just fine exepct one (rather important) thing. Depth values in selection buffer are wrong. For every object the min and max depth value is the same and equals the smalles intereger in C#. But the objects' names are good.
I am writing my program in C# and Tao Framework.
Any ideas what might be the problem?

Sorry that my code doesn't have comments but I'm polish so they wouldn't be any help for You. ;)

Here is the code (not full, of course)



static void init()
{
//**** depth on ***********
Gl.glEnable(Gl.GL_DEPTH_TEST);
Gl.glDepthFunc(Gl.GL_LEQUAL);
//******* light on ************
Gl.glEnable(Gl.GL_LIGHTING);
Gl.glEnable(Gl.GL_NORMALIZE);
Gl.glClear(Gl.GL_DEPTH_BUFFER_BIT | Gl.GL_COLOR_BUFFER_BIT);

// ************** textures on *******
Gl.glEnable(Gl.GL_TEXTURE_2D);
if (Options.mixColor)
Gl.glTexEnvi(Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, Gl.GL_DECAL);
else
Gl.glTexEnvi(Gl.GL_TEXTURE_ENV, Gl.GL_TEXTURE_ENV_MODE, Gl.GL_MODULATE);


//***********WLACZENIE SWIATLA************
if (Options.light1) Gl.glEnable(Gl.GL_LIGHT0);
else Gl.glDisable(Gl.GL_LIGHT0);
if (Options.light2) Gl.glEnable(Gl.GL_LIGHT1);
else Gl.glDisable(Gl.GL_LIGHT1);
if (Options.light3) { Gl.glEnable(Gl.GL_LIGHT3); Gl.glEnable(Gl.GL_LIGHT2); }
else { Gl.glDisable(Gl.GL_LIGHT2); Gl.glDisable(Gl.GL_LIGHT3); }
if (Options.light4) Gl.glEnable(Gl.GL_LIGHT4);
else Gl.glDisable(Gl.GL_LIGHT4);
//********************************************

Gl.glClearColor(0.8f, 0.8f, 0.8f, 0.0f);

}

static void anime()
{
light.angle += 0.5f;
Glut.glutPostRedisplay();
}

static void Reshape(int width, int height)
{

if (height == 0) height = 1;

Camera.ratio = (float)width / (float)height;


Gl.glMatrixMode(Gl.GL_PROJECTION);
Gl.glLoadIdentity();
Gl.glViewport(0, 0, width, height);
Glu.gluPerspective(45.0f, Camera.ratio, 1.0f, 700.0f);

Gl.glMatrixMode(Gl.GL_MODELVIEW);

static void startPicking(int x, int y)
{
for (int i = 0; i < selectBuffer.Length; i++)
selectBuffer.SetValue(0, i);

Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport);
Gl.glSelectBuffer(128 * 4, selectBuffer);

Gl.glRenderMode(Gl.GL_SELECT);

Gl.glInitNames();
Gl.glPushName(0);

Gl.glMatrixMode(Gl.GL_PROJECTION);
Gl.glPushMatrix();
Gl.glLoadIdentity();

Glu.gluPickMatrix(x, viewport[3] - y, 1.0f, 1.0f, viewport);
float ratio = (viewport[2] + 0.0f) / viewport[3];
Glu.gluPerspective(45.0f, ratio, 1.0f, 700.0f);

Gl.glMatrixMode(Gl.GL_MODELVIEW);

}

static int stopPicking()
{

int hits;
int selected = -1;
uint closest = uint.MaxValue;

uint distance;

Gl.glMatrixMode(Gl.GL_PROJECTION);
Gl.glPopMatrix();
Gl.glMatrixMode(Gl.GL_MODELVIEW);
Gl.glFlush();
hits = Gl.glRenderMode(Gl.GL_RENDER);

for (int i = 0; i < 16; i++)
{
Console.WriteLine(selectBuffer[i]);
}

if (hits != 0)
{
for (int i = 0; i < hits; i++)
{
distance = (uint)selectBuffer[i * 4 + 1];

if (closest >= distance)
{
closest = distance;
selected = (int)selectBuffer[i * 4 + 3];
}
}
}
select = false;
return selected;
}


static void Render()
{
Gl.glClear(Gl.GL_DEPTH_BUFFER_BIT | Gl.GL_COLOR_BUFFER_BIT);
Gl.glMatrixMode(Gl.GL_IDENTITY_NV);

init();
Gl.glLoadIdentity();
Glu.gluLookAt(Camera.x, Camera.y, Camera.z, Camera.x + Camera.lx, Camera.y + Camera.ly, Camera.z + Camera.lz, 0.0f, 1.0f, 0.0f);


light.turnOn();


Gl.glPushMatrix();

if (select)
{
startPicking(camera.Mx, camera.My);
}


draw(root, 15);


if (select)
{
if (selectedNode != null) selectedNode.changeChildren(false);
selected = stopPicking();
if (selected != -1)
{
selectedNode = root.findSelected(selected);
selectedNode.changeChildren(true);
}
else selectedNode = empty;
}
else
{
Glut.glutSwapBuffers();
}

Gl.glPopMatrix();


}

static void draw(Node node, int trans)
{

Gl.glPushMatrix();

Gl.glLoadName(node.name);
if (node.selected)
Gl.glColor3f(1.0f, 0.0f, 0.0f);
else Gl.glColor3f(1.0f, 1.0f, 1.0f);

Gl.glTranslatef(trans,trans,trans);

Gl.glTranslatef(node.transX, node.transY, node.transZ);
Gl.glRotatef(node.angleX, 1.0f, 0.0f, 0.0f);
Gl.glRotatef(node.angleY, 0.0f, 1.0f, 0.0f);
Gl.glRotatef(node.angleZ, 0.0f, 0.0f, 1.0f);

node.draw();
if (node.children.Count != 0)
{
foreach (Node child in node.children)
draw(child, trans*2);
}

Gl.glPopMatrix();

return;
}

static int Main(string[] args)
{
//**********************************************
camera = new Camera();
loader = new TextureLoader();
keyboard = new Keyboard();
light = new Light();
//**********************************************


Glut.glutInit();
Glut.glutInitWindowPosition(1, 1);
Glut.glutInitWindowSize(900, 500);
Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DEPTH | Glut.GLUT_DOUBLE);
Glut.glutCreateWindow("Viewer");
Glut.glutPopWindow();


Glut.glutIgnoreKeyRepeat(1);

Glut.glutMouseFunc(camera.moveMouse);
Glut.glutMotionFunc(camera.motionMove);
Glut.glutKeyboardFunc(keyboard.processNormalKeys);
Glut.glutSpecialFunc(keyboard.pressKey);
Glut.glutSpecialUpFunc(keyboard.releaseKey);
Glut.glutIdleFunc(anime);
Glut.glutReshapeFunc(Reshape);


//**********************************************
empty = new Node(0, new Model3D("obiekty/1.obj", 0));
root = new Node(1, new Model3D("obiekty/1.obj", 1));
child = new Node(3, new Model3D("obiekty/3.obj", 3));
root.addChild(new Node(2, new Model3D("obiekty/2.obj", 2)));
root.addChild(child);
child.addChild(new Node(4, new Model3D("obiekty/4.obj", 4)));

//**********************************************
Glut.glutDisplayFunc(Render);
Glut.glutMainLoop();
return 0;



}



class Node
{
public int name;

public float red = 0.0f;

public Boolean selected;
Model3D model;
public List<Node> children;

//*********************
public float transX;
public float transY;
public float transZ;

public float angleX;
public float angleY;
public float angleZ;

//*********************

public Node(int name_, Model3D model_)
{
name = name_;
model = model_;
selected = false;

transX = 0.0f;
transY = 0.0f;
transZ = 0.0f;

angleX = 0.0f;
angleY = 0.0f;
angleZ = 0.0f;

children = new List<Node>();
}

public void addChild(Node child)
{
children.Add(child);
}

public void draw()
{
model.draw();
}

public Node findSelected(int name_)
{
Node temp = null ;

if (this.name == name_) return this;
else
{
if (children.Count != 0)
{
foreach (Node node in children)
{
temp = node.findSelected(name_);
if (temp != null)
break;
}
}
return temp;
}
}

public void changeChildren(Boolean value)
{
this.selected = value;
if (children.Count != 0)
{
foreach (Node node in children)
{
node.changeChildren(value);
}
}
}

}


When I click on the blue object inside the sphere the selection and selection buffer looks like this:
http://img577.imageshack.us/img577/6489/vieweri.png
(Red object are selected object)

Meryll
11-14-2010, 08:40 AM
Problem solved.

psmitty7373
12-12-2010, 12:22 AM
Curious... what'd you do to fix this? I'm having the same problem!