/* virtual */ void Hdx_UnitTestWindow::OnInitializeGL() { GlfGlewInit(); GlfRegisterDefaultDebugOutputMessageCallback(); GlfContextCaps::InitInstance(); std::cout << glGetString(GL_VENDOR) << "\n"; std::cout << glGetString(GL_RENDERER) << "\n"; std::cout << glGetString(GL_VERSION) << "\n"; // // Create an offscreen draw target which is the same size as this // widget and initialize the unit test with the draw target bound. // _drawTarget = GlfDrawTarget::New(GfVec2i(GetWidth(), GetHeight())); _drawTarget->Bind(); _drawTarget->AddAttachment("color", GL_RGBA, GL_FLOAT, GL_RGBA); _drawTarget->AddAttachment("depth", GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, GL_DEPTH24_STENCIL8); _unitTest->InitTest(); _drawTarget->Unbind(); }
SdfPath My_TestGLDrawing::PickScene(int pickX, int pickY, int * outInstanceIndex, int * outElementIndex) { int width = 128; int height = 128; GlfDrawTargetRefPtr drawTarget = GlfDrawTarget::New(GfVec2i(width, height)); drawTarget->Bind(); drawTarget->AddAttachment( "primId", GL_RGBA, GL_UNSIGNED_BYTE, GL_RGBA8); drawTarget->AddAttachment( "instanceId", GL_RGBA, GL_UNSIGNED_BYTE, GL_RGBA8); drawTarget->AddAttachment( "elementId", GL_RGBA, GL_UNSIGNED_BYTE, GL_RGBA8); drawTarget->AddAttachment( "depth", GL_DEPTH_COMPONENT, GL_FLOAT, GL_DEPTH_COMPONENT32F); drawTarget->Unbind(); drawTarget->Bind(); GLenum drawBuffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2 }; glDrawBuffers(3, drawBuffers); glEnable(GL_DEPTH_TEST); GLfloat clearColor[4] = { 0.0f, 0.0f, 0.0f, 0.0f }; glClearBufferfv(GL_COLOR, 0, clearColor); glClearBufferfv(GL_COLOR, 1, clearColor); GLfloat clearDepth[1] = { 1.0f }; glClearBufferfv(GL_DEPTH, 0, clearDepth); PickParam pickParam; pickParam.location = GfVec2d(pickX, pickY); pickParam.viewport = GfVec4d(0, 0, width, height); DrawScene(&pickParam); drawTarget->Unbind(); GLubyte primId[width*height*4]; glBindTexture(GL_TEXTURE_2D, drawTarget->GetAttachments().at("primId")->GetGlTextureName()); glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, primId); GLubyte instanceId[width*height*4]; glBindTexture(GL_TEXTURE_2D, drawTarget->GetAttachments().at("instanceId")->GetGlTextureName()); glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, instanceId); GLubyte elementId[width*height*4]; glBindTexture(GL_TEXTURE_2D, drawTarget->GetAttachments().at("elementId")->GetGlTextureName()); glGetTexImage(GL_TEXTURE_2D, 0, GL_RGBA, GL_UNSIGNED_BYTE, elementId); GLfloat depths[width*height]; glBindTexture(GL_TEXTURE_2D, drawTarget->GetAttachments().at("depth")->GetGlTextureName()); glGetTexImage(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, GL_FLOAT, depths); double zMin = 1.0; int zMinIndex = -1; for (int y=0, i=0; y<height; y++) { for (int x=0; x<width; x++, i++) { if (depths[i] < zMin) { zMin = depths[i]; zMinIndex = i; } } } bool didHit = (zMin < 1.0); SdfPath result; if (didHit) { int idIndex = zMinIndex*4; result = _delegate->GetRenderIndex().GetRprimPathFromPrimId( HdxRenderSetupTask::DecodeIDRenderColor(&primId[idIndex])); if (outInstanceIndex) { *outInstanceIndex = HdxRenderSetupTask::DecodeIDRenderColor( &instanceId[idIndex]); } if (outElementIndex) { *outElementIndex = HdxRenderSetupTask::DecodeIDRenderColor( &elementId[idIndex]); } } return result; }