[수정]안드로이드 오픈지엘 질문드립니다.
글쓴이: lalupo20 / 작성시간: 화, 2021/02/02 - 1:51오후
일단 터치 처리에 관련된 부분인데,
각 객체마다 원래 화면에 보여줄 색상 말고 다른 색상값을 준비해둡니다.
터치가 들어왔을 시에 이 다른 색상값을 객체에 입혀주고 glReadPixels() 함수로 읽어들여서
들어온 픽셀값이 객체의 '다른 색상값'과 일치하면 해당 객체가 터치된 것으로 판단하는 형식입니다.
일단 glReadPixels 함수 사용부분은 다음과 같습니다.
static void engine_draw_frame(struct engine* engine) { if (engine->display == NULL) { // 디스플레이가 없습니다. return; } glClear(GL_COLOR_BUFFER_BIT); renderModule->setupViewPort(engine->width, engine->height); // 화면을 색상으로 채웁니다. glClearColor(((float)engine->state.x[0]) / engine->width, engine->state.angle, ((float)engine->state.y[0]) / engine->height, 1); renderModule->render(); if (screenTouched) { renderModule->setFakeMode(true); renderModule->render(); int x = engine->state.x[pointerIndex]; int y = screenManager->scrHeight - engine->state.y[pointerIndex]; glReadPixels(x, y, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, pixels); renderModule->setFakeMode(false); renderModule->render(); screenTouched = false; } glClear(GL_DEPTH_BUFFER_BIT); eglSwapBuffers(engine->display, engine->surface); }
그다음 render 함수는
void RenderModule::render() { View* view = viewList.at(0); view->render(); if (!fakeMode) { glManager->object()->drawAll(); } else { glManager->object()->fakeDrawAll(); } }
위와 같고
터치를 한 후 손가락을 기기에서 땔때 작동하는 함수는 다음과 같습니다.
void MainView::touchUp() { if (album != nullptr && album->checkTouch(pixels)) { if (album->isAttached()) { album->detach(); } else { album->attach(); } } if (left != nullptr && left->checkTouch(pixels)) { if (!album->isAttached()) album->attach(); int width, height; MusicFile* musicFile = MusicBox::getInstance()->container()->getMusic(++musicIndex); if (musicFile->pathStr.size() != 0) { MusicBox::getInstance()->container()->getAlbumArt(musicFile->pathStr.c_str()); unsigned char* buf = glManager->texture()->loadJPEGTextureFromSDcard("/sdcard/Android/data/com.RhythmPlanet/art.jpg", &width, &height); album->setTexture(buf, width, height, false); } } if (right != nullptr && right->checkTouch(pixels)) { if (!album->isAttached()) album->attach(); int width, height; MusicFile* musicFile = MusicBox::getInstance()->container()->getMusic(--musicIndex); if (musicFile->pathStr.size() != 0) { MusicBox::getInstance()->container()->getAlbumArt(musicFile->pathStr.c_str()); unsigned char* buf = glManager->texture()->loadJPEGTextureFromSDcard("/sdcard/Android/data/com.RhythmPlanet/art.jpg", &width, &height); album->setTexture(buf, width, height, false); } } }
checkTouch 함수는 아래와 같습니다.
bool GLObject::checkTouch(GLubyte* pixels) { bool check = false; if (pixels[0] / 255.0f == fakeColors[0]) { check = true; } return check; }
마지막으로 객체를 리스트에 삽입할때 작동하는 함수는 아래와 같습니다
void GLObjectManager::push_back(GLObject* obj) { lock_guard<std::mutex> lock(_mutex); obj->setIndex(numOfObject); objList.push_back(obj); GLfloat red = (obj->getIndex() * 1.0f); GLfloat fcolor[4] = { red / 255.0f, 1.0f, 1.0f, 1.0f }; obj->setFakeColors(fcolor, (sizeof(fcolor) / sizeof(fcolor[0]))); numOfObject++; }
이제부터 제가 드리고 싶은 질문은 위의 touchUp() 함수부분인데
right 객체는 터치이벤트가 잘 작동하는 반면,
album 객체와 left 객체는 작동하지 않습니다.
checkTouch함수에서 터치가 된 것으로 판독되지 않습니다.
어느 부분이 문제인지 좀 봐주실 수 있을까요?
정정합니다. right 객체가 left 객체로 인식되어 처리됩니다.
Forums:
댓글 달기