Jump to content
  • Advertisement
Sign in to follow this  
Meryll

OpenGL Selection buffer - depth probelm

This topic is 2802 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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)

Quote:

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);
}

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;



}



Quote:
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)

[Edited by - Meryll on November 14, 2010 6:26:27 AM]

Share this post


Link to post
Share on other sites
Advertisement
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!