call director matrix stack will also call kmGLXXX functions

This commit is contained in:
Huabing.Xu 2014-04-02 22:46:37 +08:00
parent 78eea4a735
commit 4ea56522e3
1 changed files with 74 additions and 25 deletions

View File

@ -279,25 +279,23 @@ void Director::drawScene()
setNextScene(); setNextScene();
} }
kmGLPushMatrix(); pushMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
// global identity matrix is needed... come on kazmath! // global identity matrix is needed... come on kazmath!
Matrix identity = Matrix::identity(); kmMat4 identity;
kmMat4Identity(&identity);
kmMat4 identity2;
kmMat4Fill(&identity2, identity.m);
// draw the scene // draw the scene
if (_runningScene) if (_runningScene)
{ {
_runningScene->visit(_renderer, identity2, false); _runningScene->visit(_renderer, identity, false);
_eventDispatcher->dispatchEvent(_eventAfterVisit); _eventDispatcher->dispatchEvent(_eventAfterVisit);
} }
// draw the notifications node // draw the notifications node
if (_notificationNode) if (_notificationNode)
{ {
_notificationNode->visit(_renderer, identity2, false); _notificationNode->visit(_renderer, identity, false);
} }
if (_displayStats) if (_displayStats)
@ -308,7 +306,7 @@ void Director::drawScene()
_renderer->render(); _renderer->render();
_eventDispatcher->dispatchEvent(_eventAfterDraw); _eventDispatcher->dispatchEvent(_eventAfterDraw);
kmGLPopMatrix(); popMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
_totalFrames++; _totalFrames++;
@ -445,14 +443,22 @@ void Director::popMatrix(MATRIX_STACK_TYPE type)
{ {
if(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW == type) if(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW == type)
{ {
kmGLMatrixMode(KM_GL_MODELVIEW);
kmGLPopMatrix();
_modelViewMatrixStack.pop(); _modelViewMatrixStack.pop();
} }
else if(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION == type) else if(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION == type)
{ {
kmGLMatrixMode(KM_GL_PROJECTION);
kmGLPopMatrix();
kmGLMatrixMode(KM_GL_MODELVIEW);
_projectionMatrixStack.pop(); _projectionMatrixStack.pop();
} }
else if(MATRIX_STACK_TYPE::MATRIX_STACK_TEXTURE == type) else if(MATRIX_STACK_TYPE::MATRIX_STACK_TEXTURE == type)
{ {
kmGLMatrixMode(KM_GL_TEXTURE);
kmGLPopMatrix();
kmGLMatrixMode(KM_GL_MODELVIEW);
_textureMatrixStack.pop(); _textureMatrixStack.pop();
} }
else else
@ -465,14 +471,22 @@ void Director::loadIdentityMatrix(MATRIX_STACK_TYPE type)
{ {
if(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW == type) if(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW == type)
{ {
kmGLMatrixMode(KM_GL_MODELVIEW);
kmGLLoadIdentity();
kmMat4Identity(&_modelViewMatrixStack.top()); kmMat4Identity(&_modelViewMatrixStack.top());
} }
else if(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION == type) else if(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION == type)
{ {
kmGLMatrixMode(KM_GL_PROJECTION);
kmGLLoadIdentity();
kmGLMatrixMode(KM_GL_MODELVIEW);
kmMat4Identity(&_projectionMatrixStack.top()); kmMat4Identity(&_projectionMatrixStack.top());
} }
else if(MATRIX_STACK_TYPE::MATRIX_STACK_TEXTURE == type) else if(MATRIX_STACK_TYPE::MATRIX_STACK_TEXTURE == type)
{ {
kmGLMatrixMode(KM_GL_TEXTURE);
kmGLLoadIdentity();
kmGLMatrixMode(KM_GL_MODELVIEW);
kmMat4Identity(&_textureMatrixStack.top()); kmMat4Identity(&_textureMatrixStack.top());
} }
else else
@ -485,14 +499,22 @@ void Director::loadMatrix(MATRIX_STACK_TYPE type, const kmMat4& mat)
{ {
if(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW == type) if(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW == type)
{ {
kmGLMatrixMode(KM_GL_MODELVIEW);
kmGLLoadMatrix(&mat);
_modelViewMatrixStack.top() = mat; _modelViewMatrixStack.top() = mat;
} }
else if(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION == type) else if(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION == type)
{ {
kmGLMatrixMode(KM_GL_PROJECTION);
kmGLLoadMatrix(&mat);
kmGLMatrixMode(KM_GL_MODELVIEW);
_projectionMatrixStack.top() = mat; _projectionMatrixStack.top() = mat;
} }
else if(MATRIX_STACK_TYPE::MATRIX_STACK_TEXTURE == type) else if(MATRIX_STACK_TYPE::MATRIX_STACK_TEXTURE == type)
{ {
kmGLMatrixMode(KM_GL_TEXTURE);
kmGLLoadMatrix(&mat);
kmGLMatrixMode(KM_GL_MODELVIEW);
_textureMatrixStack.top() = mat; _textureMatrixStack.top() = mat;
} }
else else
@ -505,14 +527,22 @@ void Director::multiplyMatrix(MATRIX_STACK_TYPE type, const kmMat4& mat)
{ {
if(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW == type) if(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW == type)
{ {
kmGLMatrixMode(KM_GL_MODELVIEW);
kmGLMultMatrix(&mat);
kmMat4Multiply(&_modelViewMatrixStack.top(), &_modelViewMatrixStack.top(), &mat); kmMat4Multiply(&_modelViewMatrixStack.top(), &_modelViewMatrixStack.top(), &mat);
} }
else if(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION == type) else if(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION == type)
{ {
kmGLMatrixMode(KM_GL_PROJECTION);
kmGLMultMatrix(&mat);
kmGLMatrixMode(KM_GL_MODELVIEW);
kmMat4Multiply(&_projectionMatrixStack.top(), &_projectionMatrixStack.top(), &mat); kmMat4Multiply(&_projectionMatrixStack.top(), &_projectionMatrixStack.top(), &mat);
} }
else if(MATRIX_STACK_TYPE::MATRIX_STACK_TEXTURE == type) else if(MATRIX_STACK_TYPE::MATRIX_STACK_TEXTURE == type)
{ {
kmGLMatrixMode(KM_GL_TEXTURE);
kmGLMultMatrix(&mat);
kmGLMatrixMode(KM_GL_MODELVIEW);
kmMat4Multiply(&_textureMatrixStack.top(), &_textureMatrixStack.top(), &mat); kmMat4Multiply(&_textureMatrixStack.top(), &_textureMatrixStack.top(), &mat);
} }
else else
@ -525,14 +555,22 @@ void Director::pushMatrix(MATRIX_STACK_TYPE type)
{ {
if(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW == type) if(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW == type)
{ {
kmGLMatrixMode(KM_GL_MODELVIEW);
kmGLPushMatrix();
_modelViewMatrixStack.push(_modelViewMatrixStack.top()); _modelViewMatrixStack.push(_modelViewMatrixStack.top());
} }
else if(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION == type) else if(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION == type)
{ {
kmGLMatrixMode(KM_GL_PROJECTION);
kmGLPushMatrix();
kmGLMatrixMode(KM_GL_MODELVIEW);
_projectionMatrixStack.push(_projectionMatrixStack.top()); _projectionMatrixStack.push(_projectionMatrixStack.top());
} }
else if(MATRIX_STACK_TYPE::MATRIX_STACK_TEXTURE == type) else if(MATRIX_STACK_TYPE::MATRIX_STACK_TEXTURE == type)
{ {
kmGLMatrixMode(KM_GL_TEXTURE);
kmGLPushMatrix();
kmGLMatrixMode(KM_GL_MODELVIEW);
_textureMatrixStack.push(_textureMatrixStack.top()); _textureMatrixStack.push(_textureMatrixStack.top());
} }
else else
@ -545,19 +583,31 @@ kmMat4 Director::getMatrix(MATRIX_STACK_TYPE type)
{ {
if(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW == type) if(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW == type)
{ {
kmMat4 result;
kmGLGetMatrix(KM_GL_MODELVIEW, &result);
return result;
return _modelViewMatrixStack.top(); return _modelViewMatrixStack.top();
} }
else if(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION == type) else if(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION == type)
{ {
kmMat4 result;
kmGLGetMatrix(KM_GL_PROJECTION, &result);
return result;
return _projectionMatrixStack.top(); return _projectionMatrixStack.top();
} }
else if(MATRIX_STACK_TYPE::MATRIX_STACK_TEXTURE == type) else if(MATRIX_STACK_TYPE::MATRIX_STACK_TEXTURE == type)
{ {
kmMat4 result;
kmGLGetMatrix(KM_GL_TEXTURE, &result);
return result;
return _textureMatrixStack.top(); return _textureMatrixStack.top();
} }
else else
{ {
CCASSERT(false, "unknow matrix stack type, will return modelview matrix instead"); CCASSERT(false, "unknow matrix stack type, will return modelview matrix instead");
kmMat4 result;
kmGLGetMatrix(KM_GL_MODELVIEW, &result);
return result;
return _modelViewMatrixStack.top(); return _modelViewMatrixStack.top();
} }
} }
@ -571,19 +621,17 @@ void Director::setProjection(Projection projection)
switch (projection) switch (projection)
{ {
case Projection::_2D: case Projection::_2D:
kmGLMatrixMode(KM_GL_PROJECTION); loadIdentityMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);
kmGLLoadIdentity();
#if CC_TARGET_PLATFORM == CC_PLATFORM_WP8 #if CC_TARGET_PLATFORM == CC_PLATFORM_WP8
if(getOpenGLView() != nullptr) if(getOpenGLView() != nullptr)
{ {
kmGLMultMatrix( getOpenGLView()->getOrientationMatrix()); multiplyMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION, getOpenGLView()->getOrientationMatrix());
} }
#endif #endif
kmMat4 orthoMatrix; kmMat4 orthoMatrix;
kmMat4OrthographicProjection(&orthoMatrix, 0, size.width, 0, size.height, -1024, 1024); kmMat4OrthographicProjection(&orthoMatrix, 0, size.width, 0, size.height, -1024, 1024);
kmGLMultMatrix(&orthoMatrix); multiplyMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION,orthoMatrix);
kmGLMatrixMode(KM_GL_MODELVIEW); loadIdentityMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
kmGLLoadIdentity();
break; break;
case Projection::_3D: case Projection::_3D:
@ -592,32 +640,30 @@ void Director::setProjection(Projection projection)
kmMat4 matrixPerspective, matrixLookup; kmMat4 matrixPerspective, matrixLookup;
kmGLMatrixMode(KM_GL_PROJECTION); loadIdentityMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);
kmGLLoadIdentity();
#if CC_TARGET_PLATFORM == CC_PLATFORM_WP8 #if CC_TARGET_PLATFORM == CC_PLATFORM_WP8
//if needed, we need to add a rotation for Landscape orientations on Windows Phone 8 since it is always in Portrait Mode //if needed, we need to add a rotation for Landscape orientations on Windows Phone 8 since it is always in Portrait Mode
GLView* view = getOpenGLView(); GLView* view = getOpenGLView();
if(getOpenGLView() != nullptr) if(getOpenGLView() != nullptr)
{ {
kmGLMultMatrix(getOpenGLView()->getOrientationMatrix()); multiplyMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION, getOpenGLView()->getOrientationMatrix());
} }
#endif #endif
// issue #1334 // issue #1334
kmMat4PerspectiveProjection(&matrixPerspective, 60, (GLfloat)size.width/size.height, 10, zeye+size.height/2); kmMat4PerspectiveProjection(&matrixPerspective, 60, (GLfloat)size.width/size.height, 10, zeye+size.height/2);
// kmMat4PerspectiveProjection( &matrixPerspective, 60, (GLfloat)size.width/size.height, 0.1f, 1500); // kmMat4PerspectiveProjection( &matrixPerspective, 60, (GLfloat)size.width/size.height, 0.1f, 1500);
kmGLMultMatrix(&matrixPerspective); multiplyMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION, matrixPerspective);
kmVec3 eye, center, up; kmVec3 eye, center, up;
kmVec3Fill(&eye, size.width/2, size.height/2, zeye); kmVec3Fill(&eye, size.width/2, size.height/2, zeye);
kmVec3Fill(&center, size.width/2, size.height/2, 0.0f); kmVec3Fill(&center, size.width/2, size.height/2, 0.0f);
kmVec3Fill(&up, 0.0f, 1.0f, 0.0f); kmVec3Fill(&up, 0.0f, 1.0f, 0.0f);
kmMat4LookAt(&matrixLookup, &eye, &center, &up); kmMat4LookAt(&matrixLookup, &eye, &center, &up);
kmGLMultMatrix(&matrixLookup); multiplyMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION, matrixLookup);
kmGLMatrixMode(KM_GL_MODELVIEW); loadIdentityMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
kmGLLoadIdentity();
break; break;
} }
@ -691,8 +737,11 @@ void Director::setDepthTest(bool on)
static void GLToClipTransform(kmMat4 *transformOut) static void GLToClipTransform(kmMat4 *transformOut)
{ {
Director* director = Director::getInstance();
CCASSERT(nullptr != director, "Director is null when seting matrix stack");
kmMat4 projection; kmMat4 projection;
kmGLGetMatrix(KM_GL_PROJECTION, &projection); projection = director->getMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_PROJECTION);
#if CC_TARGET_PLATFORM == CC_PLATFORM_WP8 #if CC_TARGET_PLATFORM == CC_PLATFORM_WP8
//if needed, we need to undo the rotation for Landscape orientation in order to get the correct positions //if needed, we need to undo the rotation for Landscape orientation in order to get the correct positions
@ -700,7 +749,7 @@ static void GLToClipTransform(kmMat4 *transformOut)
#endif #endif
kmMat4 modelview; kmMat4 modelview;
kmGLGetMatrix(KM_GL_MODELVIEW, &modelview); modelview = director->getMatrix(MATRIX_STACK_TYPE::MATRIX_STACK_MODELVIEW);
kmMat4Multiply(transformOut, &projection, &modelview); kmMat4Multiply(transformOut, &projection, &modelview);
} }