[수정]안드로이드 오픈지엘 질문드립니다.
글쓴이: 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:


댓글 달기