[수정]안드로이드 오픈지엘 질문드립니다.

lalupo20의 이미지

일단 터치 처리에 관련된 부분인데,

각 객체마다 원래 화면에 보여줄 색상 말고 다른 색상값을 준비해둡니다.

터치가 들어왔을 시에 이 다른 색상값을 객체에 입혀주고 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 객체로 인식되어 처리됩니다.