From Stephan Huber, "

Here's another small submission for IOS, which adds unique ids to the
touchpoints, so the ids stay the same during a touch-sequence.

(and some minor code enhancements)"
This commit is contained in:
Robert Osfield
2012-02-10 17:24:08 +00:00
parent 4457d2a145
commit d393604846
2 changed files with 95 additions and 18 deletions

View File

@@ -85,6 +85,8 @@
// custom UIView-class handling creation and display of frame/render buffers plus receives touch input
// ----------------------------------------------------------------------------------------------------------
typedef std::map<void*, unsigned int> TouchPointsIdMapping;
@interface GraphicsWindowIOSGLView : UIView
{
@private
@@ -107,6 +109,11 @@
// for multisampled antialiased rendering
GLuint _msaaFramebuffer, _msaaRenderBuffer, _msaaDepthBuffer;
TouchPointsIdMapping* _touchPointsIdMapping;
unsigned int _lastTouchPointId;
}
@@ -155,12 +162,72 @@
}
- (unsigned int)computeTouchId: (UITouch*) touch
{
unsigned int result(0);
if (!_touchPointsIdMapping) {
_lastTouchPointId = 0;
_touchPointsIdMapping = new TouchPointsIdMapping();
}
switch([touch phase])
{
case UITouchPhaseBegan:
{
TouchPointsIdMapping::iterator itr = _touchPointsIdMapping->find(touch);
// std::cout << "new: " << touch << " num: " << _touchPointsIdMapping->size() << " found: " << (itr != _touchPointsIdMapping->end()) << std::endl;
if (itr == _touchPointsIdMapping->end())
{
(*_touchPointsIdMapping)[touch] = result = _lastTouchPointId;
_lastTouchPointId++;
break;
}
}
// missing "break" by intention!
case UITouchPhaseMoved:
case UITouchPhaseStationary:
{
result = (*_touchPointsIdMapping)[touch];
}
break;
case UITouchPhaseEnded:
case UITouchPhaseCancelled:
{
TouchPointsIdMapping::iterator itr = _touchPointsIdMapping->find(touch);
// std::cout<< "remove: " << touch << " num: " << _touchPointsIdMapping->size() << " found: " << (itr != _touchPointsIdMapping->end()) << std::endl;
if (itr != _touchPointsIdMapping->end()) {
result = itr->second;
_touchPointsIdMapping->erase(itr);
}
if(_touchPointsIdMapping->size() == 0) {
_lastTouchPointId = 0;
}
// std::cout<< "remove: " << touch << " num: " << _touchPointsIdMapping->size() << std::endl;
}
break;
default:
break;
}
return result;
}
- (osg::Vec2) convertPointToPixel: (osg::Vec2) point
{
//get the views contentscale factor and multiply the point by it
float scale = 1.0f;
#ifdef __IPHONE_4_0 && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0)
#if defined(__IPHONE_4_0) && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0)
scale = self.contentScaleFactor;
#endif
return osg::Vec2(point.x()*scale, point.y()*scale);
@@ -170,6 +237,8 @@
-(void) setGraphicsWindow: (osgViewer::GraphicsWindowIOS*) win
{
_win = win;
_touchPointsIdMapping = new TouchPointsIdMapping();
_lastTouchPointId = 0;
}
- (osgViewer::GraphicsWindowIOS*) getGraphicsWindow {
@@ -222,7 +291,9 @@
- (void) dealloc
{
OSG_INFO << "GraphicsWindowIOSGLView::dealloc" << std::endl;
if(_touchPointsIdMapping)
delete _touchPointsIdMapping;
_touchPointsIdMapping = NULL;
[super dealloc];
}
@@ -283,7 +354,7 @@
//MSAA only available for >= 4.0 sdk
#ifdef __IPHONE_4_0 && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0)
#if defined(__IPHONE_4_0) && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0)
if(_win->getTraits()->sampleBuffers > 0)
{
@@ -364,7 +435,7 @@
- (void)swapBuffers {
#ifdef __IPHONE_4_0 && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0)
#if defined(__IPHONE_4_0) && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0)
if(_msaaFramebuffer)
{
glBindFramebufferOES(GL_FRAMEBUFFER_OES, _msaaFramebuffer);
@@ -389,7 +460,7 @@
//re bind the frame buffer for next frames renders
glBindFramebufferOES(GL_FRAMEBUFFER_OES, _viewFramebuffer);
#ifdef __IPHONE_4_0 && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0)
#if defined(__IPHONE_4_0) && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0)
if (_msaaFramebuffer)
glBindFramebufferOES(GL_FRAMEBUFFER_OES, _msaaFramebuffer);;
#endif
@@ -403,7 +474,7 @@
//bind the frame buffer
glBindFramebufferOES(GL_FRAMEBUFFER_OES, _viewFramebuffer);
#ifdef __IPHONE_4_0 && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0)
#if defined(__IPHONE_4_0) && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0)
if (_msaaFramebuffer)
glBindFramebufferOES(GL_READ_FRAMEBUFFER_APPLE, _msaaFramebuffer);
#endif
@@ -440,11 +511,12 @@
UITouch *touch = [[allTouches allObjects] objectAtIndex:i];
CGPoint pos = [touch locationInView:touch.view];
osg::Vec2 pixelPos = [self convertPointToPixel: osg::Vec2(pos.x,pos.y)];
unsigned int touch_id = [self computeTouchId: touch];
if (!osg_event) {
osg_event = _win->getEventQueue()->touchBegan(i, [self convertTouchPhase: [touch phase]], pixelPos.x(), pixelPos.y());
osg_event = _win->getEventQueue()->touchBegan(touch_id, [self convertTouchPhase: [touch phase]], pixelPos.x(), pixelPos.y());
} else {
osg_event->addTouchPoint(i, [self convertTouchPhase: [touch phase]], pixelPos.x(), pixelPos.y());
osg_event->addTouchPoint(touch_id, [self convertTouchPhase: [touch phase]], pixelPos.x(), pixelPos.y());
}
}
@@ -461,11 +533,12 @@
UITouch *touch = [[allTouches allObjects] objectAtIndex:i];
CGPoint pos = [touch locationInView:touch.view];
osg::Vec2 pixelPos = [self convertPointToPixel: osg::Vec2(pos.x,pos.y)];
unsigned int touch_id = [self computeTouchId: touch];
if (!osg_event) {
osg_event = _win->getEventQueue()->touchMoved(i, [self convertTouchPhase: [touch phase]], pixelPos.x(), pixelPos.y());
osg_event = _win->getEventQueue()->touchMoved(touch_id, [self convertTouchPhase: [touch phase]], pixelPos.x(), pixelPos.y());
} else {
osg_event->addTouchPoint(i, [self convertTouchPhase: [touch phase]], pixelPos.x(), pixelPos.y());
osg_event->addTouchPoint(touch_id, [self convertTouchPhase: [touch phase]], pixelPos.x(), pixelPos.y());
}
@@ -484,16 +557,20 @@
UITouch *touch = [[allTouches allObjects] objectAtIndex:i];
CGPoint pos = [touch locationInView:touch.view];
osg::Vec2 pixelPos = [self convertPointToPixel: osg::Vec2(pos.x,pos.y)];
unsigned int touch_id = [self computeTouchId: touch];
if (!osg_event) {
osg_event = _win->getEventQueue()->touchEnded(i, [self convertTouchPhase: [touch phase]], pixelPos.x(), pixelPos.y(), [touch tapCount]);
osg_event = _win->getEventQueue()->touchEnded(touch_id, [self convertTouchPhase: [touch phase]], pixelPos.x(), pixelPos.y(), [touch tapCount]);
} else {
osg_event->addTouchPoint(i, [self convertTouchPhase: [touch phase]], pixelPos.x(), pixelPos.y(), [touch tapCount]);
osg_event->addTouchPoint(touch_id, [self convertTouchPhase: [touch phase]], pixelPos.x(), pixelPos.y(), [touch tapCount]);
}
}
}
-(void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
[self touchesEnded: touches withEvent:event];
}
@end
@@ -730,7 +807,7 @@ bool GraphicsWindowIOS::realizeImplementation()
//Apply our content scale factor to our view, this is what converts the views points
//size to our desired context size.
#ifdef __IPHONE_4_0 && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0)
#if defined(__IPHONE_4_0) && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0)
theView.contentScaleFactor = _viewContentScaleFactor;
#endif
[theView setGraphicsWindow: this];

View File

@@ -72,7 +72,7 @@ void IOSWindowingSystemInterface::getScreenSettings(const osg::GraphicsContext::
//internal display supports only one mode, UiScreenMode reports wrong sizes for internal display at least for iOS 3.2
float scale = 1.0f;
#ifdef __IPHONE_4_0 && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0)
#if defined(__IPHONE_4_0) && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0)
scale = [screen scale];
#endif
@@ -123,7 +123,7 @@ void IOSWindowingSystemInterface::enumerateScreenSettings(const osg::GraphicsCon
osg::GraphicsContext::ScreenSettings resolution;
float scale = 1.0f;
#ifdef __IPHONE_4_0 && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0)
#if defined(__IPHONE_4_0) && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0)
scale = [screen scale];
#endif
@@ -256,7 +256,7 @@ bool IOSWindowingSystemInterface::getScreenContentScaleFactor(const osg::Graphic
if(screen != nil)
{
scaleFactor = 1.0f;
#ifdef __IPHONE_4_0 && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0)
#if defined(__IPHONE_4_0) && (__IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_0)
CGFloat scale = [screen scale];
scaleFactor = scale;
#endif