Ejemplo n.º 1
0
void
CloudTransformTool::update (int x, int y, BitMask modifiers, BitMask buttons)
{
  if (!cloud_ptr_)
    return;
  if (!(buttons & LEFT))
    return;
    
  float transform[MATRIX_SIZE];
    
  int dx = (x - x_);
  int dy = (y - y_);
  if (dx == 0 && dy == 0)
    return;
  trackball_.update(x, y);
  if (modifiers & CTRL)
    getTranslateMatrix(dx, dy, transform);
  else if (modifiers & ALT)
    getZTranslateMatrix(dy, transform);
  else if (modifiers & SHFT)
    getScaleMatrix(dy, transform);
  else
    trackball_.getRotationMatrix(transform);

  cloud_ptr_ -> multMatrix(transform);

  x_ = x;
  y_ = y;
}
Ejemplo n.º 2
0
void LOWaterBall::render(SunnyMatrix *MV, short waterBallsCount)
{
    const float rx = mapSize.x/mapScale;
    const float ry = mapSize.y/mapScale;
    const float sx = screenSize.x/rx/texturebufferWidth;
    const float sy = screenSize.y/ry/texturebufferHeight;
    
    sunnyUseShader(globalShaders[LOS_TexturedA_Tex]);
    glUniform1f(uniformA_Tex_A, 1);
    
    SHTextureBase::resetActiveTexture();
    glBindTexture(GL_TEXTURE_2D, textureForRender);
    SunnyMatrix m;
    for (short i = 0;i<waterBallsCount;i++)
    {
        m = getTranslateMatrix(SunnyVector3D(externWaterBallsPositions[i].x, externWaterBallsPositions[i].y, 0)) * *MV;
        
        glUniformMatrix4fv(globalModelview[LOS_TexturedA_Tex], 1, GL_FALSE, &(m.front.x));
        glUniform2fv(uniformA_Tex_Tex, 1, SunnyVector2D((externWaterBallsPositions[i].x)*sx, (externWaterBallsPositions[i].y)*sy));
        glDrawArrays(GL_TRIANGLE_FAN, LOWaterBall_VAO*4, 22);
    }
    
    SHTextureBase::bindTexture(objectsTexture);
    sunnyUseShader(globalShaders[LOS_TexturedTSA]);
    
    glEnable(GL_BLEND);
    bindGameGlobal();
    for (short i = 0;i<waterBallsCount;i++)
    {
        m = getTranslateMatrix(SunnyVector3D(externWaterBallsPositions[i].x, externWaterBallsPositions[i].y, 0)) * *MV;
        
        if (externWaterBallsPositions[i].z>0.5)
        {
            m = getRotationZMatrix(sin(realPlayingTime)*M_PI/180) * m;
            glUniformMatrix4fv(globalModelview[LOS_TexturedTSA], 1, GL_FALSE, &(m.front.x));
            glDrawArrays(GL_TRIANGLE_STRIP, (LOSmoke_VAO+14)*4, 4);
            glUniform1f(uniformTSA_A, 0.7);
            m = getRotationZMatrix(sin(1.2*realPlayingTime)*M_PI/180) * m;
            glUniformMatrix4fv(globalModelview[LOS_TexturedTSA], 1, GL_FALSE, &(m.front.x));
            glDrawArrays(GL_TRIANGLE_STRIP, (LOSmoke_VAO+15)*4, 4);
            glUniform1f(uniformTSA_A, 1);
        } else
            glUniformMatrix4fv(globalModelview[LOS_TexturedTSA], 1, GL_FALSE, &(m.front.x));
        glDrawArrays(GL_TRIANGLE_STRIP, (LOObject_VAO+43)*4, 4);
    }
}
Ejemplo n.º 3
0
void LOBonfire::renderAfterPlayer(SunnyMatrix *MV)
{
    SunnyMatrix m1 = getTranslateMatrix(SunnyVector3D(position.x, position.y, 0)) **MV;
    float scale;    
    SunnyMatrix m;
    for (short i = 0;i<smokesCount;i++)
    {
        scale = 3.0*(customBonfireSmokeLifeTime-smokes[i].lifeTime)/customBonfireSmokeLifeTime;
        if (scale>1.0) glUniform1f(uniformTSA_A, (3.0 - scale)/2.0);//glColor4f(1, 1, 1, (3.0 - scale)/2.0);
        else
            glUniform1f(uniformTSA_A, 1);//glColor4f(1, 1, 1, 1.0);
        
        m = getTranslateMatrix(SunnyVector3D(smokes[i].position.x, smokes[i].position.y,0)) *m1;
        m = getScaleMatrix(SunnyVector3D(scale, scale, 1))*m;
        glUniformMatrix4fv(globalModelview[LOS_TexturedTSA], 1, GL_FALSE, &(m.front.x));
        glDrawArrays(GL_TRIANGLE_STRIP, (smokes[i].smokeNum+LOBonfire_VAO)*4, 4);
    }
}
Ejemplo n.º 4
0
void LORollingBlades::renderOverlay(SunnyMatrix *MV)
{
    if (!charged) return;
    
    SunnyMatrix m = getTranslateMatrix(SunnyVector3D(position.x, position.y, 0)) * *MV;
    if (type==4) m = getRotationZMatrix(M_PI_2) * m;
    glUniformMatrix4fv(globalModelview[LOS_OverlayTSA], 1, GL_FALSE, &(m.front.x));
    glUniform4fv(uniformOverlayTSA_TR, 1, SunnyVector4D(0,-2*cellSize,1,1));
    SunnyDrawArrays(LOOverlayElectricity_VAO);
    glUniform4fv(uniformOverlayTSA_TR, 1, SunnyVector4D(0,2*cellSize,1,1));
    SunnyDrawArrays(LOOverlayElectricity_VAO);
}
Ejemplo n.º 5
0
void LOTutorial::render()
{
    //render back
    bindGameGlobal();
    SHTextureBase::bindTexture(menuTexture);
    
    glDisable(GL_DEPTH_TEST);
    const float farDist = -20;
    //fade
    sunnyUseShader(globalShaders[LOS_TexturedTSA]);
    SunnyMatrix m = getTranslateMatrix(SunnyVector3D(mapSize.x/2,mapSize.y/2,farDist));
    glUniformMatrix4fv(globalModelview[LOS_TexturedTSA], 1, GL_FALSE, &(m.front.x));
    glUniform1f(uniformTSA_A, 0.5*appearAlpha);
    glUniform4fv(uniformTSA_TR, 1, SunnyVector4D(0,0,1,1));
    SunnyDrawArrays(LODeath_VAO+1);
    
    //Back
    renderBackForSize(frameSize,windowCenter,appearAlpha);
    
    float scale;
    if (okButton)
    {
        scale = okButtonAlpha/1.5;
        if (okButton->active) scale*=0.85;
        m = getScaleMatrix(scale);
        m.pos = okButton->matrix.pos;
        glUniformMatrix4fv(globalModelview[LOS_TexturedTSA], 1, GL_FALSE, &(m.front.x));
        
        glUniform1f(uniformTSA_A, appearAlpha*okButtonAlpha);
        glUniform4fv(uniformTSA_TR, 1, SunnyVector4D(0, 0, 1, 1));
        SunnyDrawArrays(LOOkButtonBack_VAO);
        LOFont::writeText(&m, LOTA_Center, true, loLabelOk, SunnyVector4D(250,251,253,255*appearAlpha*okButtonAlpha)/255,SunnyVector4D(161,174,188,255*appearAlpha*okButtonAlpha)/255);
    }
    if (nameString)
    {
        m = getScaleMatrix(nameScale) * getTranslateMatrix(SunnyVector3D(namePosition.x,namePosition.y,-1));
        LOFont::writeText(&m, LOTA_Center, true, nameString, yellowInnerColor(appearAlpha),yellowOuterColor(appearAlpha));
    }
}
Ejemplo n.º 6
0
void LORollingBlades::renderElectricFieldShadow(SunnyMatrix *MV)
{
    SunnyMatrix m = getTranslateMatrix(SunnyVector3D(position.x - lightPosition.x*(0.15/lightPosition.z), position.y - lightPosition.y*(0.15/lightPosition.z),0));
    m = m * *MV;
    if (type==4)// glRotatef(90, 0, 0, 1);
        m = getRotationZMatrix(M_PI_2) * m;
    
    glUniformMatrix4fv(globalModelview[LOS_TexturedTSC], 1, GL_FALSE, &(m.front.x));
    glUniform4fv(uniformTSC_C,1, SunnyVector4D(globalColor.x,globalColor.y,globalColor.z, 1));
    
    glUniform4fv(uniformTSC_TR, 1, SunnyVector4D(0, -2*cellSize, 1, 1));
    SunnyDrawArrays(LOShadows_VAO+7);
    
    glUniform4fv(uniformTSC_TR, 1, SunnyVector4D(0, 2*cellSize, 1, -1));
    SunnyDrawArrays(LOShadows_VAO+7);
}
Ejemplo n.º 7
0
bool LOMagicDropInfo::renderOverlay()
{
    //Spells
    float YY = mapSize.y/2-0.3;
    if (dropChances[DropType_Puzzle])
        YY += verticalDistance;
    SunnyMatrix m = getScaleMatrix(0.5) * getTranslateMatrix(SunnyVector3D(mapSize.x/2-leftDistance,YY,-2));
    const float spellDistances = 0.85;
    SunnyMatrix m1;
    bindGameGlobal();
    m1 = m * getTranslateMatrix(SunnyVector3D(-spellDistances,spellDistances,0));
    LOMenu::renderSpellOverlay(LA_Teleport, &m1, appearAlpha);
    
    m1 = m * getTranslateMatrix(SunnyVector3D( spellDistances,spellDistances,0));
    LOMenu::renderSpellOverlay(LA_Speed, &m1, appearAlpha);
    
    m1 = m * getTranslateMatrix(SunnyVector3D(-spellDistances,-spellDistances,0));
    LOMenu::renderSpellOverlay(LA_Life, &m1, appearAlpha);
    
    m1 = m * getTranslateMatrix(SunnyVector3D(spellDistances,-spellDistances,0));
    LOMenu::renderSpellOverlay(LA_Shield, &m1, appearAlpha);
    
    //Ability
    bindGameGlobal();
    m = getScaleMatrix(0.5) * getTranslateMatrix(SunnyVector3D(mapSize.x/2+rightDistance,YY,-2));
    
    m1 = m * getTranslateMatrix(SunnyVector3D(-spellDistances,spellDistances,0));
    LOMenu::renderSpellOverlay(LA_Magnet, &m1, appearAlpha);
    
    m1 = m * getTranslateMatrix(SunnyVector3D( spellDistances,spellDistances,0));
    LOMenu::renderSpellOverlay(LA_Time, &m1, appearAlpha);
    
    m1 = m * getTranslateMatrix(SunnyVector3D(0,-spellDistances,0));
    LOMenu::renderSpellOverlay(LA_Doubler, &m1, appearAlpha);
    return true;
}
Ejemplo n.º 8
0
void LOWaterBall::render(SunnyMatrix *MV)
{
    if (status != LO_Active) return;
    
    SunnyMatrix m = getTranslateMatrix(SunnyVector3D(position.pos.x, position.pos.y, 0)) **MV;
    
    if (anomaled)
    {
        m = getRotationZMatrix(sin(realPlayingTime)*M_PI/180) * m;
        glUniformMatrix4fv(globalModelview[LOS_TexturedTSA], 1, GL_FALSE, &(m.front.x));
        glDrawArrays(GL_TRIANGLE_STRIP, (LOSmoke_VAO+14)*4, 4);
        
        glUniform1f(uniformTSA_A, 0.7);
        m = getRotationZMatrix(sin(1.2*realPlayingTime)*M_PI/180) * m;
        glUniformMatrix4fv(globalModelview[LOS_TexturedTSA], 1, GL_FALSE, &(m.front.x));

        glDrawArrays(GL_TRIANGLE_STRIP, (LOSmoke_VAO+15)*4, 4);
        glUniform1f(uniformTSA_A, 1);
    } else
        glUniformMatrix4fv(globalModelview[LOS_TexturedTSA], 1, GL_FALSE, &(m.front.x));
    glDrawArrays(GL_TRIANGLE_STRIP, (LOWaterBall_VAO+frameNum)*4, 4);
}
Ejemplo n.º 9
0
void LORollingBlades::render(SunnyMatrix *MV)
{
#ifndef SKIP_PHYSICS
    if (type==3 || type==4)
    {
        SunnyMatrix m = getTranslateMatrix(SunnyVector3D(position.x, position.y, 0)) * *MV;
        if (type==4) m = getRotationZMatrix(M_PI_2) * m;//glRotatef(90, 0, 0, 1);
        glUniformMatrix4fv(globalModelview[LOS_Textured3DA], 1, GL_FALSE, &(m.front.x));
        if (bounds.y<0)
        {
            electricField->renderObject(0);
            if (charged)
            {
                attachPhysics();
                electricField->renderObject(1+sRandomi()%5);
                if (attaking)
                    electricField->renderObject(6+sRandomi()%3);
            } else
                detachPhysics();
            return;
        }
        short count = (realPlayingTime+startAngle)/bounds.y;
        float time = realPlayingTime+startAngle - count*bounds.y;
        
        electricField->renderObject(0);
        if (time<bounds.x)//on
        {
            attachPhysics();
            electricField->renderObject(1+sRandomi()%5);
            if (attaking)
                electricField->renderObject(6+sRandomi()%3);
            charged = 1;
        } else//off
        {
            detachPhysics();
            charged = 0;
        }
    } else
    if (type==2)//rolling
    {
        if (!physicsPaused)
        {
            position.x += velocityScale*deltaTime*timeToDistance;
            startAngle+=(float)deltaTime;
        }
        if (velocityScale>0)
        {
            if (position.x>=bounds.y)
            {
                velocityScale = -velocityScale;
                position.x = bounds.y - (position.x - bounds.y);
                startAngle = 0;
            }
        } else
        {
            if (position.x<=bounds.x)
            {
                velocityScale = -velocityScale;
                position.x = bounds.x + (bounds.x - position.x);
                startAngle = 0;
            }
        }
        
        body->position.x = position.x;
        
        SunnyMatrix m1 = getTranslateMatrix(SunnyVector3D(position.x, position.y, 0)) **MV;
        SunnyVector2D shadowTranslate(-lightPosition.x*(0.3/lightPosition.z),-lightPosition.y*(0.3/lightPosition.z));
        
        //6        
        SunnyMatrix m = getTranslateMatrix(SunnyVector3D(shadowTranslate.x, shadowTranslate.y, 0)) * m1;
        glUniformMatrix4fv(globalModelview[LOS_TexturedTSC], 1, GL_FALSE, &(m.front.x));
        glDrawArrays(GL_TRIANGLE_STRIP, (LORollingBlades_VAO+5)*4, 4);
        m = getRotationZMatrix(M_PI) * m;
        glUniformMatrix4fv(globalModelview[LOS_TexturedTSC], 1, GL_FALSE, &(m.front.x));
        glDrawArrays(GL_TRIANGLE_STRIP, (LORollingBlades_VAO+5)*4, 4);
        //5
        m = getTranslateMatrix(SunnyVector3D(shadowTranslate.x, shadowTranslate.y, 0)) * m1;
        m = getRotationZMatrix(-M_PI_4);
        glUniformMatrix4fv(globalModelview[LOS_TexturedTSC], 1, GL_FALSE, &(m.front.x));
        glDrawArrays(GL_TRIANGLE_STRIP, (LORollingBlades_VAO+4)*4, 4);
        //4
        m = m1;
        glUniformMatrix4fv(globalModelview[LOS_TexturedTSC], 1, GL_FALSE, &(m.front.x));
        glDrawArrays(GL_TRIANGLE_STRIP, (LORollingBlades_VAO+3)*4, 4);
        m = getRotationZMatrix(M_PI) * m;
        glUniformMatrix4fv(globalModelview[LOS_TexturedTSC], 1, GL_FALSE, &(m.front.x));
        glDrawArrays(GL_TRIANGLE_STRIP, (LORollingBlades_VAO+3)*4, 4);
        //3
        m = getTranslateMatrix(SunnyVector3D(shadowTranslate.x/2, shadowTranslate.y/2, 0)) * m1;
        m = getRotationZMatrix(M_PI_4);
        glUniformMatrix4fv(globalModelview[LOS_TexturedTSC], 1, GL_FALSE, &(m.front.x));
        glDrawArrays(GL_TRIANGLE_STRIP, (LORollingBlades_VAO+2)*4, 4);
        
        glUniformMatrix4fv(globalModelview[LOS_TexturedTSC], 1, GL_FALSE, &(m1.front.x));
        //2
        glDrawArrays(GL_TRIANGLE_STRIP, (LORollingBlades_VAO+1)*4, 4);
        //1
        glDrawArrays(GL_TRIANGLE_STRIP, (LORollingBlades_VAO)*4, 4);
    } else
    {
        float angle = (realPlayingTime*velocityScale*timeToAngle + startAngle);
        blade->rotationAngle = angle;
        SunnyVector2D shadowTranslate(-lightPosition.x*(0.3/lightPosition.z),-lightPosition.y*(0.3/lightPosition.z));
        SunnyMatrix m1 = getTranslateMatrix(SunnyVector3D(position.x, position.y, 0)) **MV;
        
        //6
        SunnyMatrix m = getTranslateMatrix(SunnyVector3D(shadowTranslate.x, shadowTranslate.y, 0)) * m1;
        m = getRotationZMatrix(angle)*m;
        glUniformMatrix4fv(globalModelview[LOS_TexturedTSC], 1, GL_FALSE, &(m.front.x));
        glDrawArrays(GL_TRIANGLE_STRIP, (LORollingBlades_VAO+5)*4, 4);
        m = getRotationZMatrix(M_PI*2/3)*m;
        glUniformMatrix4fv(globalModelview[LOS_TexturedTSC], 1, GL_FALSE, &(m.front.x));
        glDrawArrays(GL_TRIANGLE_STRIP, (LORollingBlades_VAO+5)*4, 4);
        m = getRotationZMatrix(M_PI*2/3)*m;
        glUniformMatrix4fv(globalModelview[LOS_TexturedTSC], 1, GL_FALSE, &(m.front.x));
        glDrawArrays(GL_TRIANGLE_STRIP, (LORollingBlades_VAO+5)*4, 4);
        //5
        m = getTranslateMatrix(SunnyVector3D(shadowTranslate.x, shadowTranslate.y, 0)) * m1;
        m = getRotationZMatrix(-M_PI_4);
        glUniformMatrix4fv(globalModelview[LOS_TexturedTSC], 1, GL_FALSE, &(m.front.x));
        glDrawArrays(GL_TRIANGLE_STRIP, (LORollingBlades_VAO+4)*4, 4);
        //4
        m = getRotationZMatrix(angle)*m1;
        glUniformMatrix4fv(globalModelview[LOS_TexturedTSC], 1, GL_FALSE, &(m.front.x));
        glDrawArrays(GL_TRIANGLE_STRIP, (LORollingBlades_VAO+3)*4, 4);
        m = getRotationZMatrix(M_PI*2/3)*m;
        glUniformMatrix4fv(globalModelview[LOS_TexturedTSC], 1, GL_FALSE, &(m.front.x));
        glDrawArrays(GL_TRIANGLE_STRIP, (LORollingBlades_VAO+3)*4, 4);
        m = getRotationZMatrix(M_PI*2/3)*m;
        glUniformMatrix4fv(globalModelview[LOS_TexturedTSC], 1, GL_FALSE, &(m.front.x));
        glDrawArrays(GL_TRIANGLE_STRIP, (LORollingBlades_VAO+3)*4, 4);
        //3
        m = getTranslateMatrix(SunnyVector3D(shadowTranslate.x/2, shadowTranslate.y/2, 0)) * m1;
        m = getRotationZMatrix(M_PI_4);
        glUniformMatrix4fv(globalModelview[LOS_TexturedTSC], 1, GL_FALSE, &(m.front.x));
        glDrawArrays(GL_TRIANGLE_STRIP, (LORollingBlades_VAO+2)*4, 4);
        //2
        glUniformMatrix4fv(globalModelview[LOS_TexturedTSC], 1, GL_FALSE, &(m1.front.x));
        glDrawArrays(GL_TRIANGLE_STRIP, (LORollingBlades_VAO+1)*4, 4);
        //1
        m = getRotationZMatrix(angle)*m1;
        glUniformMatrix4fv(globalModelview[LOS_TexturedTSC], 1, GL_FALSE, &(m.front.x));
        glDrawArrays(GL_TRIANGLE_STRIP, (LORollingBlades_VAO)*4, 4);
    }
#endif
}
Ejemplo n.º 10
0
void LOElectricBall::renderOverlay(SunnyMatrix *MV)
{
    SunnyMatrix m = getTranslateMatrix(SunnyVector3D(position.pos.x, position.pos.y, 0)) * *MV;
    glUniformMatrix4fv(globalModelview[LOS_OverlayTSA], 1, GL_FALSE, &(m.front.x));
    SunnyDrawArrays(LOOverlayElectricity_VAO);
}
Ejemplo n.º 11
0
void LOMagicDropInfo::render()
{
    LOTutorial::render();

    //Spells
    float YY = mapSize.y/2-0.3;
    if (dropChances[DropType_Puzzle])
        YY += verticalDistance;
    SunnyMatrix m = getScaleMatrix(0.5) * getTranslateMatrix(SunnyVector3D(mapSize.x/2-leftDistance,YY,-2));
    const float spellDistances = 0.85;
    SunnyMatrix m1;
    bindGameGlobal();
    m1 = m * getTranslateMatrix(SunnyVector3D(-spellDistances,spellDistances,0));
    LOMenu::renderSpellButton(LA_Teleport, &m1, 1, 1, 0,false,appearAlpha);
    
    m1 = m * getTranslateMatrix(SunnyVector3D( spellDistances,spellDistances,0));
    LOMenu::renderSpellButton(LA_Speed, &m1, 1, 1, 0,false,appearAlpha);
    
    m1 = m * getTranslateMatrix(SunnyVector3D(-spellDistances,-spellDistances,0));
    LOMenu::renderSpellButton(LA_Life, &m1, 1, 1, 0,false,appearAlpha);
    
    m1 = m * getTranslateMatrix(SunnyVector3D(spellDistances,-spellDistances,0));
    LOMenu::renderSpellButton(LA_Shield, &m1, 1, 1, 0,false,appearAlpha);
    
    m1 = getScaleMatrix(0.7) * m * getTranslateMatrix(SunnyVector3D(spellDistances*2.5,0,0));
    LOFont::writeText(&m1, LOTA_LeftCenter, true, dropChances[DropType_Spell],whiteInnerColor(appearAlpha),whiteOuterColor(appearAlpha));
    
    
    //Ability
    bindGameGlobal();
    m = getScaleMatrix(0.5) * getTranslateMatrix(SunnyVector3D(mapSize.x/2+rightDistance,YY,-2));
    
    m1 = m * getTranslateMatrix(SunnyVector3D(-spellDistances,spellDistances,0));
    LOMenu::renderSpellButton(LA_Magnet, &m1, 1, 1, 0,false,appearAlpha);
    
    m1 = m * getTranslateMatrix(SunnyVector3D( spellDistances,spellDistances,0));
    LOMenu::renderSpellButton(LA_Time, &m1, 1, 1, 0,false,appearAlpha);
    
    m1 = m * getTranslateMatrix(SunnyVector3D(0,-spellDistances,0));
    LOMenu::renderSpellButton(LA_Doubler, &m1, 1, 1, 0,false,appearAlpha);
    
    m1 = getScaleMatrix(0.7) * m * getTranslateMatrix(SunnyVector3D(spellDistances*2.5,0,0));
    LOFont::writeText(&m1, LOTA_LeftCenter, true, dropChances[DropType_Buff],whiteInnerColor(appearAlpha),whiteOuterColor(appearAlpha));
    
    //Puzzle
    if (dropChances[DropType_Puzzle])
    {
        bindGameGlobal();
        YY -= 3*verticalDistance;
        m = getScaleMatrix(0.5) * getTranslateMatrix(SunnyVector3D(mapSize.x/2 -1,YY,-2));
        m1 = getScaleMatrix(2) * m * getTranslateMatrix(SunnyVector3D(-2,0,0));
        LOMenu::renderPuzzleImage(&m1, appearAlpha);
        LOFont::writeText(&m, LOTA_LeftCenter, true, dropChances[DropType_Puzzle],whiteInnerColor(appearAlpha),whiteOuterColor(appearAlpha));
    }
}
Ejemplo n.º 12
0
void LOPuzzle::render()
{
    if (!puzzleTextureID<0 || puzzleObject==0) return;
    
    glEnable(GL_DEPTH_TEST);
    glDisable(GL_BLEND);
    glEnable(GL_CULL_FACE);

    SHTextureBase::bindTexture(puzzleTextureID);
    SunnyMatrix m1 = getScaleMatrix(puzzlePartsScale) *  getRotationXMatrix(M_PI_2);
    SunnyMatrix m;
    puzzleObject->prepareForRender(isVAOSupported);
    
    sunnyUseShader(globalShaders[LOS_Textured3D]);
    glUniform4fv(uniform3D_C, 1, SunnyVector4D(1,1,1,1));

    float depth = 0;
    float shadowD = 0;
    for (short i = puzzleHorizontalSize*puzzleVerticalSize-1;i>=0;i--)
    if (puzzleParts[renderOrder[i]].active)
    {
        if (rotatingParts[renderOrder[i]].isRotating)
        {
            float angle = (- 1 + rotatingParts[renderOrder[i]].time/ppRotationTime)*M_PI_2;
            SunnyVector2D distance = puzzleParts[renderOrder[i]].position - rotatingParts[renderOrder[i]].origin;
            SunnyVector2D pos;
            pos.x = distance.x*cosf(angle) + distance.y*sinf(angle);
            pos.y =-distance.x*sinf(angle) + distance.y*cosf(angle);
            pos += rotatingParts[renderOrder[i]].origin;
            angle = (puzzleParts[renderOrder[i]].rotation - 1 + rotatingParts[renderOrder[i]].time/ppRotationTime)*M_PI_2;
            m = getRotationZMatrix(-angle) * getTranslateMatrix(SunnyVector3D(pos.x,pos.y,-5));
        } else
        {
            m = getRotationZMatrix(-puzzleParts[renderOrder[i]].rotation*M_PI_2) * getTranslateMatrix(SunnyVector3D(puzzleParts[renderOrder[i]].position.x,puzzleParts[renderOrder[i]].position.y,-200+depth));
        }
        if (puzzleHeight[renderOrder[i]]>1)
        {
            m =  getScaleMatrix(puzzleHeight[renderOrder[i]]) * getRotationXMatrix(-M_PI*4*(puzzleHeight[renderOrder[i]]-1))*  m;
            puzzleHeight[renderOrder[i]] -= deltaTime;
            if (puzzleHeight[renderOrder[i]]<1)
                puzzleHeight[renderOrder[i]] = 1;
        }
        m = getTranslateMatrix(partsTranslations[renderOrder[i]]) * m1*m;
        glUniformMatrix4fv(globalModelview[LOS_Textured3D], 1, GL_FALSE, &(m.front.x));
        puzzleObject->renderObject(objectsNumbers[renderOrder[i]]);
        
        if (i+1 == selectedPartsCount)
            shadowD = depth;

        depth += 5;
    }
    
    if (selectedParts)
    {
        glEnable(GL_BLEND);
        SunnyVector3D shadowSize(-0.15,-0.15,-1);
        sunnyUseShader(globalShaders[LOS_Textured3DA]);
        glUniform4fv(uniform3D_A, 1, SunnyVector4D(0,0,0,0.3));
        for (short i = 0;i<selectedPartsCount;i++)
        {
            if (rotatingParts[selectedParts[i]].isRotating)
            {
                float angle = (- 1 + rotatingParts[selectedParts[i]].time/ppRotationTime)*M_PI_2;
                SunnyVector2D distance = puzzleParts[selectedParts[i]].position - rotatingParts[selectedParts[i]].origin;
                SunnyVector2D pos;
                pos.x = distance.x*cosf(angle) + distance.y*sinf(angle);
                pos.y =-distance.x*sinf(angle) + distance.y*cosf(angle);
                pos += rotatingParts[selectedParts[i]].origin;
                angle = (puzzleParts[selectedParts[i]].rotation - 1 + rotatingParts[selectedParts[i]].time/ppRotationTime)*M_PI_2;
                m = getRotationZMatrix(-angle) * getTranslateMatrix(SunnyVector3D(pos.x,pos.y,-5));
            } else
                m = getRotationZMatrix(-puzzleParts[selectedParts[i]].rotation*M_PI_2) * getTranslateMatrix(SunnyVector3D(puzzleParts[selectedParts[i]].position.x+shadowSize.x,puzzleParts[selectedParts[i]].position.y+shadowSize.y,-200+shadowSize.z+shadowD));
            m = getTranslateMatrix(partsTranslations[renderOrder[i]]) * m1*m;
            glUniformMatrix4fv(globalModelview[LOS_Textured3DA], 1, GL_FALSE, &(m.front.x));
            puzzleObject->renderObject(objectsNumbers[selectedParts[i]]);
        }
    }
    glDisable(GL_CULL_FACE);
    glEnable(GL_BLEND);
    glDisable(GL_DEPTH_TEST);
    bindGameGlobal();
    SHTextureBase::bindTexture(menuTexture);
    
    const float mapKoef = mapSize.x/1920;
    const float farDist = -20;
    //fade
    sunnyUseShader(globalShaders[LOS_TexturedTSA]);
    m = sunnyIdentityMatrix;
    glUniformMatrix4fv(globalModelview[LOS_TexturedTSA], 1, GL_FALSE, &(m.front.x));
    glUniform1f(uniformTSA_A, 1);
    
    //Buttons
    {
        
        m = getTranslateMatrix(SunnyVector3D(0,0,farDist));
        glUniform1f(uniformTSA_A, 1);
        float btnScale;
        SunnyMatrix rot;
        rot = m;
        //Back
        rot.pos = puzzleButtons[PuzzleButton_Back]->matrix.pos;
        puzzleButtons[PuzzleButton_Back]->active?btnScale = defaultButtonScale:btnScale = 1;
        glUniformMatrix4fv(globalModelview[LOS_TexturedTSA], 1, GL_FALSE, &(rot.front.x));
        btnScale *= 0.82;
        glUniform4fv(uniformTSA_TR, 1, SunnyVector4D(0, 0, btnScale, btnScale));
        SunnyDrawArrays(LOLCButtonsVAO);
        glUniform4fv(uniformTSA_TR, 1, SunnyVector4D(-4*mapKoef, 6*mapKoef, btnScale, btnScale));
        SunnyDrawArrays(LOLCButtonsVAO+6);
        
//        //Store
//        rot.pos = puzzleButtons[PuzzleButton_Store]->matrix.pos;
//        puzzleButtons[PuzzleButton_Store]->active?btnScale = defaultButtonScale:btnScale = 1;
//        glUniformMatrix4fv(globalModelview[LOS_TexturedTSA], 1, GL_FALSE, &(rot.front.x));
//        glUniform4fv(uniformTSA_TR, 1, SunnyVector4D(0, 0, btnScale, btnScale));
//        SunnyDrawArrays(LOLCButtonsVAO);
//        glUniform4fv(uniformTSA_TR, 1, SunnyVector4D(-4*mapKoef, -2*mapKoef, btnScale, btnScale));
//        SunnyDrawArrays(LOLCButtonsVAO+2);
        
        //break
        if (!puzzleButtons[PuzzleButton_Break]->hidden)
        {
            rot.pos = puzzleButtons[PuzzleButton_Break]->matrix.pos;
            puzzleButtons[PuzzleButton_Break]->active?btnScale = defaultButtonScale:btnScale = 1;
            glUniformMatrix4fv(globalModelview[LOS_TexturedTSA], 1, GL_FALSE, &(rot.front.x));
            btnScale *= 0.82;
            glUniform4fv(uniformTSA_TR, 1, SunnyVector4D(0, 0, btnScale, btnScale));
            SunnyDrawArrays(LOLCButtonsVAO);
            glUniform4fv(uniformTSA_TR, 1, SunnyVector4D(-2*mapKoef, 4*mapKoef, btnScale, btnScale));
            SunnyDrawArrays(LOLCButtonsVAO+3);
        }
    }
}