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; }
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); } }
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); } }
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); }
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)); } }
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); }
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; }
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); }
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 }
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); }
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)); } }
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); } } }