def render(self, visibility, topMost): self.engine.view.setViewport(1,0) SceneClient.render(self, visibility, topMost) bigFont = self.engine.data.bigFont font = self.engine.data.font v = ((1 - visibility) ** 2) glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) glEnable(GL_COLOR_MATERIAL) self.engine.view.setOrthogonalProjection(normalize = True) try: t = self.time / 100 w, h, = self.engine.view.geometry[2:4] r = .5 if self.background: imgwidth = self.background.width1() wfactor = 640.000/imgwidth self.background.transform.reset() #self.background.transform.scale(1,-1) self.background.transform.scale(wfactor,-wfactor) self.background.transform.translate(w/2,h/2) self.background.draw() if self.showHighscores: for j,player in enumerate(self.playerList): #self.engine.view.setViewportHalf(len(self.playerList),j) scale = 0.0017 endScroll = -.14 if self.pauseScroll != None: self.offset = 0.0 if self.pauseScroll > 0.5: self.pauseScroll = None if self.offset == None: self.offset = 0 self.pauseScroll = 0 self.nextHighScore() # evilynux - highscore if self.song is not None: text = _("%s High Scores for %s") % (self.scorePart, self.song.info.name) else: text = _("%s High Scores") % self.scorePart w, h = font.getStringSize(text) Theme.setBaseColor(1 - v) font.render(text, (.5 - w / 2, .01 - v + self.offset)) text = _("Difficulty: %s") % (self.scoreDifficulty) w, h = font.getStringSize(text) Theme.setBaseColor(1 - v) font.render(text, (.5 - w / 2, .01 - v + h + self.offset)) x = .01 y = .16 + v if self.song: i = -1 for i, scores in enumerate(self.song.info.getHighscores(self.scoreDifficulty, part = self.scorePart)): score, stars, name, scores_ext = scores notesHit, notesTotal, noteStreak, modVersion, modOptions1, modOptions2 = scores_ext if stars == 6: stars = 5 perfect = 1 else: perfect = 0 for j,player in enumerate(self.playerList): if (self.time % 10.0) < 5.0 and i == self.highscoreIndex[j] and self.scoreDifficulty == player.difficulty and self.scorePart == player.part: Theme.setSelectedColor(1 - v) break else: Theme.setBaseColor(1 - v) font.render("%d." % (i + 1), (x, y + self.offset), scale = scale) if notesTotal != 0: score = "%s %.1f%%" % (score, (float(notesHit) / notesTotal) * 100.0) if noteStreak != 0: score = "%s (%d)" % (score, noteStreak) font.render(unicode(score), (x + .05, y + self.offset), scale = scale) options = "" w2, h2 = font.getStringSize(options, scale = scale / 2) font.render(unicode(options), (.6 - w2, y + self.offset), scale = scale / 2) # evilynux - Fixed star size following Font render bugfix if perfect == 1 and self.theme == 2: glColor3f(1, 1, 0) #racer: perfect is now gold for rock band font.render(unicode(Data.STAR2 * stars + Data.STAR1 * (5 - stars)), (x + .6, y + self.offset), scale = scale * 1.8) if perfect == 1 and self.theme < 2: glColor3f(0, 1, 0) #racer: perfect is green for any non-RB theme font.render(unicode(Data.STAR2 * stars + Data.STAR1 * (5 - stars)), (x + .6, y + self.offset), scale = scale * 1.8) for j,player in enumerate(self.playerList): if (self.time % 10.0) < 5.0 and i == self.highscoreIndex[j] and self.scoreDifficulty == player.difficulty and self.scorePart == player.part: Theme.setSelectedColor(1 - v) break else: Theme.setBaseColor(1 - v) font.render(name, (x + .8, y + self.offset), scale = scale) y += h endScroll -= .07 if self.offset < endScroll or i == -1: self.offset = .8 self.nextHighScore() endScroll = -0.14 if self.uploadingScores and self.uploadResult is None: Theme.setBaseColor(1 - v) font.render(_("Uploading Scores..."), (.05, .7 + v), scale = 0.001) return Theme.setBaseColor(1 - v) if self.playerList[0].cheating: text = _("%s Cheated!") % self.song.info.name else: text = _("%s Finished!") % self.song.info.name w, h = font.getStringSize(text) Dialogs.wrapText(font, (.05, .045 - v), text) text = "%d/" % self.hits text2 = _("%d notes hit") % self.totalnotes text = text + text2 w, h = font.getStringSize(text) Dialogs.wrapText(font, (.5 - w / 2, .54 - v - h), text) for j,player in enumerate(self.playerList): if self.playerList[j].cheating: self.stars[j] = 0 self.accuracy[j] = 0.0 self.engine.view.setViewportHalf(len(self.playerList),j) text = "%d" % (player.score * self.anim(1000, 2000)) w, h = bigFont.getStringSize(text) bigFont.render(text, (.5 - w / 2, .11 + v + (1.0 - self.anim(0, 1000) ** 3)), scale = 0.0025) if self.counter > 1000: scale = 0.0017 if self.stars[j] == 6 and self.theme == 2: #racer: gold perfect for RB glColor3f(1, 1, 0) text = (Data.STAR2 * (self.stars[j] - 1)) elif self.stars[j] == 6 and self.theme < 2: #racer: green perfect for non-RB glColor3f(0, 1, 0) text = (Data.STAR2 * (self.stars[j] - 1)) else: text = (Data.STAR2 * self.stars[j] + Data.STAR1 * (5 - self.stars[j])) w, h = bigFont.getStringSize(Data.STAR1, scale = scale) x = .5 - w * len(text) / 2 for i, ch in enumerate(text): bigFont.render(ch, (x + 100 * (1.0 - self.anim(1000 + i * 200, 1000 + (i + 1) * 200)) ** 2, .35 + v), scale = scale) x += w if self.counter > 2500: Theme.setBaseColor(1 - v) text = _("Accuracy: %.1f%%") % self.accuracy[j] w, h = font.getStringSize(text) font.render(text, (.5 - w / 2, .55 + v)) text = _("Longest note streak: %d") % player.longestStreak w, h = font.getStringSize(text) font.render(text, (.5 - w / 2, .55 + h + v)) if player.twoChord > 0: text = _("Part: %s on %s (2 chord)") % (player.part, player.difficulty) else: text = _("Part: %s on %s") % (player.part, player.difficulty) w, h = font.getStringSize(text) font.render(text, (.5 - w / 2, .55 + (2 * h)+ v)) self.engine.view.setViewport(1,0) finally: self.engine.view.setViewport(1,0) self.engine.view.resetProjection()
def render(self, visibility, topMost): self.engine.view.setViewport(1, 0) SceneClient.render(self, visibility, topMost) bigFont = self.engine.data.bigFont font = self.engine.data.font v = ((1 - visibility)**2) glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) glEnable(GL_COLOR_MATERIAL) self.engine.view.setOrthogonalProjection(normalize=True) try: t = self.time / 100 w, h, = self.engine.view.geometry[2:4] r = .5 if self.background: imgwidth = self.background.width1() wfactor = 640.000 / imgwidth self.background.transform.reset() #self.background.transform.scale(1,-1) self.background.transform.scale(wfactor, -wfactor) self.background.transform.translate(w / 2, h / 2) self.background.draw() if self.showHighscores: for j, player in enumerate(self.playerList): #self.engine.view.setViewportHalf(len(self.playerList),j) scale = 0.0017 endScroll = -.14 if self.pauseScroll != None: self.offset = 0.0 if self.pauseScroll > 0.5: self.pauseScroll = None if self.offset == None: self.offset = 0 self.pauseScroll = 0 self.nextHighScore() # evilynux - highscore if self.song is not None: text = _("%s High Scores for %s") % ( self.scorePart, self.song.info.name) else: text = _("%s High Scores") % self.scorePart w, h = font.getStringSize(text) Theme.setBaseColor(1 - v) font.render(text, (.5 - w / 2, .01 - v + self.offset)) text = _("Difficulty: %s") % (self.scoreDifficulty) w, h = font.getStringSize(text) Theme.setBaseColor(1 - v) font.render(text, (.5 - w / 2, .01 - v + h + self.offset)) x = .01 y = .16 + v if self.song: i = -1 for i, scores in enumerate( self.song.info.getHighscores(self.scoreDifficulty, part=self.scorePart)): score, stars, name, scores_ext = scores notesHit, notesTotal, noteStreak, modVersion, modOptions1, modOptions2 = scores_ext if stars == 6: stars = 5 perfect = 1 else: perfect = 0 for j, player in enumerate(self.playerList): if (self.time % 10.0 ) < 5.0 and i == self.highscoreIndex[ j] and self.scoreDifficulty == player.difficulty and self.scorePart == player.part: Theme.setSelectedColor(1 - v) break else: Theme.setBaseColor(1 - v) font.render("%d." % (i + 1), (x, y + self.offset), scale=scale) if notesTotal != 0: score = "%s %.1f%%" % ( score, (float(notesHit) / notesTotal) * 100.0) if noteStreak != 0: score = "%s (%d)" % (score, noteStreak) font.render(unicode(score), (x + .05, y + self.offset), scale=scale) options = "" w2, h2 = font.getStringSize(options, scale=scale / 2) font.render(unicode(options), (.6 - w2, y + self.offset), scale=scale / 2) # evilynux - Fixed star size following Font render bugfix if perfect == 1 and self.theme == 2: glColor3f( 1, 1, 0) #racer: perfect is now gold for rock band font.render(unicode(Data.STAR2 * stars + Data.STAR1 * (5 - stars)), (x + .6, y + self.offset), scale=scale * 1.8) if perfect == 1 and self.theme < 2: glColor3f( 0, 1, 0 ) #racer: perfect is green for any non-RB theme font.render(unicode(Data.STAR2 * stars + Data.STAR1 * (5 - stars)), (x + .6, y + self.offset), scale=scale * 1.8) for j, player in enumerate(self.playerList): if (self.time % 10.0 ) < 5.0 and i == self.highscoreIndex[ j] and self.scoreDifficulty == player.difficulty and self.scorePart == player.part: Theme.setSelectedColor(1 - v) break else: Theme.setBaseColor(1 - v) font.render(name, (x + .8, y + self.offset), scale=scale) y += h endScroll -= .07 if self.offset < endScroll or i == -1: self.offset = .8 self.nextHighScore() endScroll = -0.14 if self.uploadingScores and self.uploadResult is None: Theme.setBaseColor(1 - v) font.render(_("Uploading Scores..."), (.05, .7 + v), scale=0.001) return Theme.setBaseColor(1 - v) if self.playerList[0].cheating: text = _("%s Cheated!") % self.song.info.name else: text = _("%s Finished!") % self.song.info.name w, h = font.getStringSize(text) Dialogs.wrapText(font, (.05, .045 - v), text) text = "%d/" % self.hits text2 = _("%d notes hit") % self.totalnotes text = text + text2 w, h = font.getStringSize(text) Dialogs.wrapText(font, (.5 - w / 2, .54 - v - h), text) for j, player in enumerate(self.playerList): if self.playerList[j].cheating: self.stars[j] = 0 self.accuracy[j] = 0.0 self.engine.view.setViewportHalf(len(self.playerList), j) text = "%d" % (player.score * self.anim(1000, 2000)) w, h = bigFont.getStringSize(text) bigFont.render(text, (.5 - w / 2, .11 + v + (1.0 - self.anim(0, 1000)**3)), scale=0.0025) if self.counter > 1000: scale = 0.0017 if self.stars[ j] == 6 and self.theme == 2: #racer: gold perfect for RB glColor3f(1, 1, 0) text = (Data.STAR2 * (self.stars[j] - 1)) elif self.stars[ j] == 6 and self.theme < 2: #racer: green perfect for non-RB glColor3f(0, 1, 0) text = (Data.STAR2 * (self.stars[j] - 1)) else: text = (Data.STAR2 * self.stars[j] + Data.STAR1 * (5 - self.stars[j])) w, h = bigFont.getStringSize(Data.STAR1, scale=scale) x = .5 - w * len(text) / 2 for i, ch in enumerate(text): bigFont.render( ch, (x + 100 * (1.0 - self.anim(1000 + i * 200, 1000 + (i + 1) * 200))**2, .35 + v), scale=scale) x += w if self.counter > 2500: Theme.setBaseColor(1 - v) text = _("Accuracy: %.1f%%") % self.accuracy[j] w, h = font.getStringSize(text) font.render(text, (.5 - w / 2, .55 + v)) text = _("Longest note streak: %d") % player.longestStreak w, h = font.getStringSize(text) font.render(text, (.5 - w / 2, .55 + h + v)) if player.twoChord > 0: text = _("Part: %s on %s (2 chord)") % ( player.part, player.difficulty) else: text = _("Part: %s on %s") % (player.part, player.difficulty) w, h = font.getStringSize(text) font.render(text, (.5 - w / 2, .55 + (2 * h) + v)) self.engine.view.setViewport(1, 0) finally: self.engine.view.setViewport(1, 0) self.engine.view.resetProjection()
def render(self, visibility, topMost): SceneClient.render(self, visibility, topMost) font = self.engine.data.font bigFont = self.engine.data.bigFont self.visibility = v = 1.0 - ((1 - visibility) ** 2) self.engine.view.setOrthogonalProjection(normalize = True) try: # show countdown if self.countdown > 1: Theme.setBaseColor(min(1.0, 3.0 - abs(4.0 - self.countdown))) text = _("Get Ready to Rock") w, h = font.getStringSize(text) font.render(text, (.5 - w / 2, .3)) if self.countdown < 6: scale = 0.002 + 0.0005 * (self.countdown % 1) ** 3 text = "%d" % (self.countdown) w, h = bigFont.getStringSize(text, scale = scale) Theme.setSelectedColor() bigFont.render(text, (.5 - w / 2, .45 - h / 2), scale = scale) w, h = font.getStringSize(" ") y = .05 - h / 2 - (1.0 - v) * .2 # show song name if self.countdown and self.song: Theme.setBaseColor(min(1.0, 4.0 - abs(4.0 - self.countdown))) Dialogs.wrapText(font, (.05, .05 - h / 2), self.song.info.name + " \n " + self.song.info.artist, rightMargin = .6, scale = 0.0015) Theme.setSelectedColor() font.render("%d" % (self.player.score + self.getExtraScoreForCurrentlyPlayedNotes()), (.6, y)) font.render("%dx" % self.player.getScoreMultiplier(), (.6, y + h)) # show the streak counter and miss message if self.player.streak > 0 and self.song: text = _("%d hit") % self.player.streak factor = 0.0 if self.lastPickPos: diff = self.getSongPosition() - self.lastPickPos if diff > 0 and diff < self.song.period * 2: factor = .25 * (1.0 - (diff / (self.song.period * 2))) ** 2 factor = (1.0 + factor) * 0.002 tw, th = font.getStringSize(text, scale = factor) font.render(text, (.16 - tw / 2, y + h / 2 - th / 2), scale = factor) elif self.lastPickPos is not None and self.countdown <= 0: diff = self.getSongPosition() - self.lastPickPos alpha = 1.0 - diff * 0.005 if alpha > .1: Theme.setSelectedColor(alpha) glPushMatrix() glTranslate(.1, y + 0.000005 * diff ** 2, 0) glRotatef(math.sin(self.lastPickPos) * 25, 0, 0, 1) font.render(_("Missed!"), (0, 0)) glPopMatrix() # show the streak balls if self.player.streak >= 30: glColor3f(.5, .5, 1) elif self.player.streak >= 20: glColor3f(1, 1, .5) elif self.player.streak >= 10: glColor3f(1, .5, .5) else: glColor3f(.5, 1, .5) s = min(39, self.player.streak) % 10 + 1 font.render(Data.BALL2 * s + Data.BALL1 * (10 - s), (.67, y + h * 1.3), scale = 0.0011) # show multiplier changes if self.song and self.lastMultTime is not None: diff = self.getSongPosition() - self.lastMultTime if diff > 0 and diff < self.song.period * 2: m = self.player.getScoreMultiplier() c = (1, 1, 1) if self.player.streak >= 40: texture = None elif m == 1: texture = None elif m == 2: texture = self.fx2x.texture c = (1, .5, .5) elif m == 3: texture = self.fx3x.texture c = (1, 1, .5) elif m == 4: texture = self.fx4x.texture c = (.5, .5, 1) f = (1.0 - abs(self.song.period * 1 - diff) / (self.song.period * 1)) ** 2 # Flash the screen glBegin(GL_TRIANGLE_STRIP) glColor4f(c[0], c[1], c[2], (f - .5) * 1) glVertex2f(0, 0) glColor4f(c[0], c[1], c[2], (f - .5) * 1) glVertex2f(1, 0) glColor4f(c[0], c[1], c[2], (f - .5) * .25) glVertex2f(0, 1) glColor4f(c[0], c[1], c[2], (f - .5) * .25) glVertex2f(1, 1) glEnd() if texture: glPushMatrix() glEnable(GL_TEXTURE_2D) texture.bind() size = (texture.pixelSize[0] * .002, texture.pixelSize[1] * .002) glTranslatef(.5, .15, 0) glBlendFunc(GL_SRC_ALPHA, GL_ONE) f = .5 + .5 * (diff / self.song.period) ** 3 glColor4f(1, 1, 1, min(1, 2 - f)) glBegin(GL_TRIANGLE_STRIP) glTexCoord2f(0.0, 0.0) glVertex2f(-size[0] * f, -size[1] * f) glTexCoord2f(1.0, 0.0) glVertex2f( size[0] * f, -size[1] * f) glTexCoord2f(0.0, 1.0) glVertex2f(-size[0] * f, size[1] * f) glTexCoord2f(1.0, 1.0) glVertex2f( size[0] * f, size[1] * f) glEnd() glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) glPopMatrix() # show the comments if self.song and self.song.info.tutorial: glColor3f(1, 1, 1) pos = self.getSongPosition() for time, event in self.song.track.getEvents(pos - self.song.period * 2, pos + self.song.period * 4): if isinstance(event, PictureEvent): if pos < time or pos > time + event.length: continue try: picture = event.picture except: self.engine.loadImgDrawing(event, "picture", os.path.join(self.libraryName, self.songName, event.fileName)) picture = event.picture w, h, = self.engine.view.geometry[2:4] fadePeriod = 500.0 f = (1.0 - min(1.0, abs(pos - time) / fadePeriod) * min(1.0, abs(pos - time - event.length) / fadePeriod)) ** 2 picture.transform.reset() picture.transform.translate(w / 2, (f * -2 + 1) * h / 2) picture.transform.scale(1, -1) picture.draw() elif isinstance(event, TextEvent): if pos >= time and pos <= time + event.length: text = _(event.text) w, h = font.getStringSize(text) font.render(text, (.5 - w / 2, .67)) finally: self.engine.view.resetProjection()
def render(self, visibility, topMost): self.engine.view.setViewport(1, 0) SceneClient.render(self, visibility, topMost) bigFont = self.engine.data.bigFont font = self.engine.data.font v = ((1 - visibility)**2) glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) glEnable(GL_COLOR_MATERIAL) self.engine.view.setOrthogonalProjection(normalize=True) try: t = self.time / 100 w, h, = self.engine.view.geometry[2:4] r = .5 if self.background: imgwidth = self.background.width1() wfactor = 640.000 / imgwidth self.background.transform.reset() #self.background.transform.scale(1,-1) self.background.transform.scale(wfactor, -wfactor) self.background.transform.translate(w / 2, h / 2) self.background.draw() if self.showHighscores: for j, player in enumerate(self.playerList): #self.engine.view.setViewportHalf(len(self.playerList),j) scale = 0.0017 endScroll = -.14 if self.pauseScroll != None: self.offset = 0.0 if self.pauseScroll > 0.5: self.pauseScroll = None if self.offset == None: self.offset = 0 self.pauseScroll = 0 self.nextHighScore() # evilynux - highscore if self.song is not None: text = _("%s High Scores for %s") % ( self.scorePart, Dialogs.removeSongOrderPrefixFromName( self.song.info.name)) else: text = _("%s High Scores") % self.scorePart w, h = font.getStringSize(text) Theme.setBaseColor(1 - v) font.render(text, (.5 - w / 2, .01 - v + self.offset)) text = _("Difficulty: %s") % (self.scoreDifficulty) w, h = font.getStringSize(text) Theme.setBaseColor(1 - v) font.render(text, (.5 - w / 2, .01 - v + h + self.offset)) x = .01 y = .16 + v if self.song: i = -1 for i, scores in enumerate( self.song.info.getHighscores(self.scoreDifficulty, part=self.scorePart)): score, stars, name, scores_ext = scores notesHit, notesTotal, noteStreak, modVersion, modOptions1, modOptions2 = scores_ext if stars == 6: stars = 5 perfect = 1 else: perfect = 0 for j, player in enumerate(self.playerList): if (self.time % 10.0 ) < 5.0 and i == self.highscoreIndex[ j] and self.scoreDifficulty == player.difficulty and self.scorePart == player.part: Theme.setSelectedColor(1 - v) break else: Theme.setBaseColor(1 - v) font.render("%d." % (i + 1), (x, y + self.offset), scale=scale) if notesTotal != 0: score = "%s %.1f%%" % ( score, (float(notesHit) / notesTotal) * 100.0) if noteStreak != 0: score = "%s (%d)" % (score, noteStreak) font.render(unicode(score), (x + .05, y + self.offset), scale=scale) options = "" w2, h2 = font.getStringSize(options, scale=scale / 2) font.render(unicode(options), (.6 - w2, y + self.offset), scale=scale / 2) # evilynux - Fixed star size following Font render bugfix if perfect == 1 and self.theme == 2: glColor3f( 1, 1, 0) #racer: perfect is now gold for rock band font.render(unicode(Data.STAR2 * stars + Data.STAR1 * (5 - stars)), (x + .6, y + self.offset), scale=scale * 1.8) if perfect == 1 and self.theme < 2: glColor3f( 0, 1, 0 ) #racer: perfect is green for any non-RB theme font.render(unicode(Data.STAR2 * stars + Data.STAR1 * (5 - stars)), (x + .6, y + self.offset), scale=scale * 1.8) for j, player in enumerate(self.playerList): if (self.time % 10.0 ) < 5.0 and i == self.highscoreIndex[ j] and self.scoreDifficulty == player.difficulty and self.scorePart == player.part: Theme.setSelectedColor(1 - v) break else: Theme.setBaseColor(1 - v) font.render(name, (x + .8, y + self.offset), scale=scale) y += h endScroll -= .07 if self.offset < endScroll or i == -1: #self.offset = .8 self.offset = self.scoreScrollStartOffset self.nextHighScore() endScroll = -0.14 for j, player in enumerate(self.playerList): #MFH if self.uploadingScores[j]: sScale = 0.001 sW, sH = font.getStringSize("A", scale=sScale) sYPos = .7 - ((sH * 1.25) * j) Theme.setBaseColor(1 - v) if self.highScoreResult[j] is None: upScoreText = _("Uploading Scores...") font.render("P%d (%s) %s" % (j + 1, player.name, upScoreText), (.05, sYPos + v), scale=sScale) else: result = str(self.highScoreResult[j]).split(";") if len(result) > 0: upScoreText1 = _("Scores uploaded!") if result[0] == "True": #MFH - display rank if it was successful if len(result) > 1: #font.render(_("Scores uploaded! ...your highscore ranks #" + result[1] + " on the world starpower chart!" ), (.05, .7 + v), scale = 0.001) upScoreText2 = _( "your highscore ranks") upScoreText3 = _( "on the world starpower chart!") font.render( "P%d (%s) %s %s ...%s #%d %s" % (j + 1, player.name, player.part.text, upScoreText1, upScoreText2, int( result[1]), upScoreText3), (.05, sYPos + v), scale=sScale) else: upScoreText2 = _("unknown rank.") font.render( "P%d (%s) %s %s ... %s" % (j + 1, player.name, player.part.text, upScoreText1, upScoreText2), (.05, sYPos + v), scale=sScale) else: upScoreText2 = _("no new highscore.") #font.render(_("Score upload failed! World charts may be down."), (.05, .7 + v), scale = 0.001) font.render( "P%d (%s) %s %s ...%s" % (j + 1, player.name, player.part.text, upScoreText1, upScoreText2), (.05, sYPos + v), scale=sScale) else: upScoreText1 = _( "Score upload failed! World charts may be down." ) font.render("P%d (%s) %s %s" % (j + 1, player.name, player.part.text, upScoreText1), (.05, sYPos + v), scale=sScale) return #initial scoring - skipped after names entered Theme.setBaseColor(1 - v) if self.playerList[0].cheating: text = _( "%s Cheated!") % Dialogs.removeSongOrderPrefixFromName( self.song.info.name) else: text = _( "%s Finished!") % Dialogs.removeSongOrderPrefixFromName( self.song.info.name) w, h = font.getStringSize(text) Dialogs.wrapText(font, (.05, .045 - v), text) text = "%d/" % self.hits text2 = _("%d notes hit") % self.totalnotes text = text + text2 w, h = font.getStringSize(text) Dialogs.wrapText(font, (.5 - w / 2, .54 - v - h), text) #MFH - HOPO system & hit window display settingsScale = 0.0012 #settingsText = "%s settings - HOPOs: %s / %s, Hit Window: %s" % (self.engine.versionString, self.hopoStyle, self.hopoFreq, self.hitWindow) settingsText = "%s %s - %s: %s / %s, %s: %s" % ( self.engine.versionString, self.tsSettings, self.tsHopos, self.hopoStyle, self.hopoFreq, self.tsHitWindow, self.hitWindow) w, h = font.getStringSize(settingsText, settingsScale) font.render(settingsText, (.5 - w / 2, 0.0), scale=settingsScale) for j, player in enumerate(self.playerList): if self.playerList[j].cheating: self.stars[j] = 0 self.accuracy[j] = 0.0 self.engine.view.setViewportHalf(len(self.playerList), j) text = "%d" % (player.score * self.anim(1000, 2000)) w, h = bigFont.getStringSize(text) bigFont.render(text, (.5 - w / 2, .11 + v + (1.0 - self.anim(0, 1000)**3)), scale=0.0025) if self.counter > 1000: scale = 0.0017 if self.stars[ j] == 6 and self.theme == 2: #racer: gold perfect for RB glColor3f(1, 1, 0) text = (Data.STAR2 * (self.stars[j] - 1)) elif self.stars[ j] == 6 and self.theme < 2: #racer: green perfect for non-RB glColor3f(0, 1, 0) text = (Data.STAR2 * (self.stars[j] - 1)) else: text = (Data.STAR2 * self.stars[j] + Data.STAR1 * (5 - self.stars[j])) w, h = bigFont.getStringSize(Data.STAR1, scale=scale) x = .5 - w * len(text) / 2 for i, ch in enumerate(text): bigFont.render( ch, (x + 100 * (1.0 - self.anim(1000 + i * 200, 1000 + (i + 1) * 200))**2, .35 + v), scale=scale) x += w if self.counter > 2500: Theme.setBaseColor(1 - v) text = _("Accuracy: %.1f%%") % self.accuracy[j] w, h = font.getStringSize(text) font.render(text, (.5 - w / 2, .55 + v)) text = _("Longest note streak: %d") % player.longestStreak w, h = font.getStringSize(text) font.render(text, (.5 - w / 2, .55 + h + v)) if player.twoChord > 0: text = _("Part: %s on %s (2 chord)") % ( player.part, player.difficulty) else: text = _("Part: %s on %s") % (player.part, player.difficulty) w, h = font.getStringSize(text) font.render(text, (.5 - w / 2, .55 + (2 * h) + v)) self.engine.view.setViewport(1, 0) finally: self.engine.view.setViewport(1, 0) self.engine.view.resetProjection()
def render(self, visibility, topMost): SceneClient.render(self, visibility, topMost) bigFont = self.engine.data.bigFont font = self.engine.data.font v = ((1 - visibility) ** 2) glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) glEnable(GL_COLOR_MATERIAL) self.engine.view.setOrthogonalProjection(normalize = True) try: t = self.time / 100 w, h, = self.engine.view.geometry[2:4] r = .5 self.background.transform.reset() self.background.transform.translate(v * 2 * w + w / 2 + math.cos(t / 2) * w / 2 * r, h / 2 + math.sin(t) * h / 2 * r) self.background.transform.rotate(-t) self.background.transform.scale(math.sin(t / 8) + 2, math.sin(t / 8) + 2) self.background.draw() if self.showHighscores: scale = 0.0017 d = self.player.difficulty text = _("Highest Scores (%s)") % d w, h = font.getStringSize(text) Theme.setBaseColor(1 - v) font.render(text, (.5 - w / 2, .05 - v)) x = .1 y = .15 + v for i, scores in enumerate(self.song.info.getHighscores(d)): score, stars, name = scores if i == self.highscoreIndex and (self.time % 10.0) < 5.0: Theme.setSelectedColor(1 - v) else: Theme.setBaseColor(1 - v) font.render("%d." % (i + 1), (x, y), scale = scale) font.render(unicode(score), (x + .05, y), scale = scale) font.render(unicode(Data.STAR2 * stars + Data.STAR1 * (5 - stars)), (x + .25, y), scale = scale * .9) font.render(name, (x + .5, y), scale = scale) y += h if self.uploadingScores: Theme.setBaseColor(1 - v) if self.uploadResult is None: text = _("Uploading Scores...") else: success, ordinal = self.uploadResult if success: if ordinal > 0: text = _("You're #%d on the world charts!") % ordinal else: text = "" else: text = _("Score upload failed") font.render(text, (.05, .7 + v), scale = 0.001) return Theme.setBaseColor(1 - v) text = _("Song Finished!") w, h = font.getStringSize(text) font.render(text, (.5 - w / 2, .05 - v)) text = "%d" % (self.player.score * self.anim(1000, 2000)) w, h = bigFont.getStringSize(text) bigFont.render(text, (.5 - w / 2, .11 + v + (1.0 - self.anim(0, 1000) ** 3)), scale = 0.0025) if self.counter > 1000: scale = 0.0017 text = (Data.STAR2 * self.stars + Data.STAR1 * (5 - self.stars)) w, h = bigFont.getStringSize(Data.STAR1, scale = scale) x = .5 - w * len(text) / 2 for i, ch in enumerate(text): bigFont.render(ch, (x + 100 * (1.0 - self.anim(1000 + i * 200, 1000 + (i + 1) * 200)) ** 2, .35 + v), scale = scale) x += w if self.counter > 2500: text = _("Accuracy: %d%%") % self.accuracy w, h = font.getStringSize(text) font.render(text, (.5 - w / 2, .55 + v)) text = _("Longest note streak: %d") % self.player.longestStreak w, h = font.getStringSize(text) font.render(text, (.5 - w / 2, .55 + h + v)) finally: self.engine.view.resetProjection()
def render(self, visibility, topMost): self.engine.view.setViewport(1,0) SceneClient.render(self, visibility, topMost) bigFont = self.engine.data.bigFont font = self.engine.data.font v = ((1 - visibility) ** 2) glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) glEnable(GL_COLOR_MATERIAL) self.engine.view.setOrthogonalProjection(normalize = True) try: t = self.time / 100 w, h, = self.engine.view.geometry[2:4] r = .5 if self.background: imgwidth = self.background.width1() wfactor = 640.000/imgwidth self.background.transform.reset() #self.background.transform.scale(1,-1) self.background.transform.scale(wfactor,-wfactor) self.background.transform.translate(w/2,h/2) self.background.draw() if self.showHighscores: for j,player in enumerate(self.playerList): #self.engine.view.setViewportHalf(len(self.playerList),j) scale = 0.0017 endScroll = -.14 if self.pauseScroll != None: self.offset = 0.0 if self.pauseScroll > 0.5: self.pauseScroll = None if self.offset == None: self.offset = 0 self.pauseScroll = 0 self.nextHighScore() # evilynux - highscore if self.song is not None: text = _("%s High Scores for %s") % (self.scorePart, Dialogs.removeSongOrderPrefixFromName(self.song.info.name)) else: text = _("%s High Scores") % self.scorePart w, h = font.getStringSize(text) Theme.setBaseColor(1 - v) font.render(text, (.5 - w / 2, .01 - v + self.offset)) text = _("Difficulty: %s") % (self.scoreDifficulty) w, h = font.getStringSize(text) Theme.setBaseColor(1 - v) font.render(text, (.5 - w / 2, .01 - v + h + self.offset)) x = .01 y = .16 + v if self.song: i = -1 for i, scores in enumerate(self.song.info.getHighscores(self.scoreDifficulty, part = self.scorePart)): score, stars, name, scores_ext = scores notesHit, notesTotal, noteStreak, modVersion, modOptions1, modOptions2 = scores_ext if stars == 6: stars = 5 perfect = 1 else: perfect = 0 for j,player in enumerate(self.playerList): if (self.time % 10.0) < 5.0 and i == self.highscoreIndex[j] and self.scoreDifficulty == player.difficulty and self.scorePart == player.part: Theme.setSelectedColor(1 - v) break else: Theme.setBaseColor(1 - v) font.render("%d." % (i + 1), (x, y + self.offset), scale = scale) if notesTotal != 0: score = "%s %.1f%%" % (score, (float(notesHit) / notesTotal) * 100.0) if noteStreak != 0: score = "%s (%d)" % (score, noteStreak) font.render(unicode(score), (x + .05, y + self.offset), scale = scale) options = "" w2, h2 = font.getStringSize(options, scale = scale / 2) font.render(unicode(options), (.6 - w2, y + self.offset), scale = scale / 2) # evilynux - Fixed star size following Font render bugfix if perfect == 1 and self.theme == 2: glColor3f(1, 1, 0) #racer: perfect is now gold for rock band font.render(unicode(Data.STAR2 * stars + Data.STAR1 * (5 - stars)), (x + .6, y + self.offset), scale = scale * 1.8) if perfect == 1 and self.theme < 2: glColor3f(0, 1, 0) #racer: perfect is green for any non-RB theme font.render(unicode(Data.STAR2 * stars + Data.STAR1 * (5 - stars)), (x + .6, y + self.offset), scale = scale * 1.8) for j,player in enumerate(self.playerList): if (self.time % 10.0) < 5.0 and i == self.highscoreIndex[j] and self.scoreDifficulty == player.difficulty and self.scorePart == player.part: Theme.setSelectedColor(1 - v) break else: Theme.setBaseColor(1 - v) font.render(name, (x + .8, y + self.offset), scale = scale) y += h endScroll -= .07 if self.offset < endScroll or i == -1: self.offset = .8 self.nextHighScore() endScroll = -0.14 for j,player in enumerate(self.playerList): #MFH if self.uploadingScores[j]: sScale = 0.001 sW, sH = font.getStringSize("A", scale = sScale) sYPos = .7 - ( (sH * 1.25) * j) Theme.setBaseColor(1 - v) if self.highScoreResult[j] is None: upScoreText = _("Uploading Scores...") font.render("P%d (%s) %s" % (j+1, player.name, upScoreText), (.05, sYPos + v), scale = sScale) else: result = str(self.highScoreResult[j]).split(";") if len(result) > 0: upScoreText1 = _("Scores uploaded!") if result[0] == "True": #MFH - display rank if it was successful if len(result) > 1: #font.render(_("Scores uploaded! ...your highscore ranks #" + result[1] + " on the world starpower chart!" ), (.05, .7 + v), scale = 0.001) upScoreText2 = _("your highscore ranks") upScoreText3 = _("on the world starpower chart!") font.render("P%d (%s) %s %s ...%s #%d %s" % (j+1, player.name, player.part.text, upScoreText1, upScoreText2, int(result[1]), upScoreText3), (.05, sYPos + v), scale = sScale) else: upScoreText2 = _("unknown rank.") font.render("P%d (%s) %s %s ... %s" % (j+1, player.name, player.part.text, upScoreText1, upScoreText2), (.05, sYPos + v), scale = sScale) else: upScoreText2 = _("no new highscore.") #font.render(_("Score upload failed! World charts may be down."), (.05, .7 + v), scale = 0.001) font.render("P%d (%s) %s %s ...%s" % (j+1, player.name, player.part.text, upScoreText1, upScoreText2), (.05, sYPos + v), scale = sScale) else: upScoreText1 = _("Score upload failed! World charts may be down.") font.render("P%d (%s) %s %s" % (j+1, player.name, player.part.text, upScoreText1), (.05, sYPos + v), scale = sScale) return #initial scoring - skipped after names entered Theme.setBaseColor(1 - v) if self.playerList[0].cheating: text = _("%s Cheated!") % Dialogs.removeSongOrderPrefixFromName(self.song.info.name) else: text = _("%s Finished!") % Dialogs.removeSongOrderPrefixFromName(self.song.info.name) w, h = font.getStringSize(text) Dialogs.wrapText(font, (.05, .045 - v), text) text = "%d/" % self.hits text2 = _("%d notes hit") % self.totalnotes text = text + text2 w, h = font.getStringSize(text) Dialogs.wrapText(font, (.5 - w / 2, .54 - v - h), text) #MFH - TODO - add HOPO system & hit window display to this screen settingsScale = 0.0012 settingsText = "HOPOs: %s, Hit Window: %s" % (self.hopoStyle, self.hitWindow) w, h = font.getStringSize(settingsText, settingsScale) font.render(settingsText, (.5 - w/2, 0.0), scale = settingsScale) for j,player in enumerate(self.playerList): if self.playerList[j].cheating: self.stars[j] = 0 self.accuracy[j] = 0.0 self.engine.view.setViewportHalf(len(self.playerList),j) text = "%d" % (player.score * self.anim(1000, 2000)) w, h = bigFont.getStringSize(text) bigFont.render(text, (.5 - w / 2, .11 + v + (1.0 - self.anim(0, 1000) ** 3)), scale = 0.0025) if self.counter > 1000: scale = 0.0017 if self.stars[j] == 6 and self.theme == 2: #racer: gold perfect for RB glColor3f(1, 1, 0) text = (Data.STAR2 * (self.stars[j] - 1)) elif self.stars[j] == 6 and self.theme < 2: #racer: green perfect for non-RB glColor3f(0, 1, 0) text = (Data.STAR2 * (self.stars[j] - 1)) else: text = (Data.STAR2 * self.stars[j] + Data.STAR1 * (5 - self.stars[j])) w, h = bigFont.getStringSize(Data.STAR1, scale = scale) x = .5 - w * len(text) / 2 for i, ch in enumerate(text): bigFont.render(ch, (x + 100 * (1.0 - self.anim(1000 + i * 200, 1000 + (i + 1) * 200)) ** 2, .35 + v), scale = scale) x += w if self.counter > 2500: Theme.setBaseColor(1 - v) text = _("Accuracy: %.1f%%") % self.accuracy[j] w, h = font.getStringSize(text) font.render(text, (.5 - w / 2, .55 + v)) text = _("Longest note streak: %d") % player.longestStreak w, h = font.getStringSize(text) font.render(text, (.5 - w / 2, .55 + h + v)) if player.twoChord > 0: text = _("Part: %s on %s (2 chord)") % (player.part, player.difficulty) else: text = _("Part: %s on %s") % (player.part, player.difficulty) w, h = font.getStringSize(text) font.render(text, (.5 - w / 2, .55 + (2 * h)+ v)) self.engine.view.setViewport(1,0) finally: self.engine.view.setViewport(1,0) self.engine.view.resetProjection()
def render(self, visibility, topMost): SceneClient.render(self, visibility, topMost) bigFont = self.engine.data.bigFont font = self.engine.data.font v = ((1 - visibility) ** 2) glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) glEnable(GL_COLOR_MATERIAL) self.engine.view.setOrthogonalProjection(normalize = True) try: t = self.time / 100 w, h, = self.engine.view.geometry[2:4] r = .5 if self.background: if self.spinnyDisabled != True and Theme.spinnyResultsDisabled != True: self.background.transform.reset() self.background.transform.translate(v * 2 * w + w / 2 + math.cos(t / 2) * w / 2 * r, h / 2 + math.sin(t) * h / 2 * r) self.background.transform.rotate(-t) self.background.transform.scale(math.sin(t / 8) + 2, math.sin(t / 8) + 2) self.background.draw() if self.showHighscores: for j,player in enumerate(self.playerList): #self.engine.view.setViewportHalf(len(self.playerList),j) scale = 0.0017 endScroll = -.14 if self.pauseScroll != None: self.offset = 0.0 if self.pauseScroll > 0.5: self.pauseScroll = None if self.offset == None: self.offset = 0 self.pauseScroll = 0 self.nextHighScore() text = _("%s High Scores") % (self.scorePart) w, h = font.getStringSize(text) Theme.setBaseColor(1 - v) font.render(text, (.5 - w / 2, .01 - v + self.offset)) text = _("Difficulty: %s") % (self.scoreDifficulty) w, h = font.getStringSize(text) Theme.setBaseColor(1 - v) font.render(text, (.5 - w / 2, .01 - v + h + self.offset)) x = .01 y = .16 + v if self.song: i = -1 for i, scores in enumerate(self.song.info.getHighscores(self.scoreDifficulty, part = self.scorePart)): score, stars, name, scores_ext = scores notesHit, notesTotal, noteStreak, modVersion, modOptions1, modOptions2 = scores_ext if stars == 6: stars = 5 perfect = 1 else: perfect = 0 for j,player in enumerate(self.playerList): if (self.time % 10.0) < 5.0 and i == self.highscoreIndex[j] and self.scoreDifficulty == player.difficulty and self.scorePart == player.part: Theme.setSelectedColor(1 - v) break else: Theme.setBaseColor(1 - v) font.render("%d." % (i + 1), (x, y + self.offset), scale = scale) if notesTotal != 0: score = "%s %.1f%%" % (score, (float(notesHit) / notesTotal) * 100.0) if noteStreak != 0: score = "%s %d" % (score, noteStreak) font.render(unicode(score), (x + .05, y + self.offset), scale = scale) options = "" #options = "%s,%s" % (modOptions1, modOptions2) #options = self.engine.config.prettyModOptions(options) w2, h2 = font.getStringSize(options, scale = scale / 2) font.render(unicode(options), (.6 - w2, y + self.offset), scale = scale / 2) if perfect == 1: glColor3f(0, 1, 0) font.render(unicode(Data.STAR2 * stars + Data.STAR1 * (5 - stars)), (x + .6, y + self.offset), scale = scale * .9) for j,player in enumerate(self.playerList): if (self.time % 10.0) < 5.0 and i == self.highscoreIndex[j] and self.scoreDifficulty == player.difficulty and self.scorePart == player.part: Theme.setSelectedColor(1 - v) break else: Theme.setBaseColor(1 - v) font.render(name, (x + .8, y + self.offset), scale = scale) y += h endScroll -= .07 if self.offset < endScroll or i == -1: self.offset = .8 self.nextHighScore() endScroll = -0.14 if self.uploadingScores and self.uploadResult is None: Theme.setBaseColor(1 - v) font.render(_("Uploading Scores..."), (.05, .7 + v), scale = 0.001) #self.engine.view.setViewport(1,0) return Theme.setBaseColor(1 - v) if self.playerList[0].cheating: text = _("%s Cheated!" % self.song.info.name) else: text = _("%s Finished!" % self.song.info.name) w, h = font.getStringSize(text) Dialogs.wrapText(font, (.05, .05 - v), text) for j,player in enumerate(self.playerList): if self.playerList[j].cheating: self.stars[j] = 0 self.accuracy[j] = 0.0 self.engine.view.setViewportHalf(len(self.playerList),j) text = "%d" % (player.score * self.anim(1000, 2000)) w, h = bigFont.getStringSize(text) bigFont.render(text, (.5 - w / 2, .11 + v + (1.0 - self.anim(0, 1000) ** 3)), scale = 0.0025) if self.counter > 1000: scale = 0.0017 if self.stars[j] == 6: glColor3f(0, 1, 0) text = (Data.STAR2 * (self.stars[j] - 1)) else: text = (Data.STAR2 * self.stars[j] + Data.STAR1 * (5 - self.stars[j])) w, h = bigFont.getStringSize(Data.STAR1, scale = scale) x = .5 - w * len(text) / 2 for i, ch in enumerate(text): bigFont.render(ch, (x + 100 * (1.0 - self.anim(1000 + i * 200, 1000 + (i + 1) * 200)) ** 2, .35 + v), scale = scale) x += w if self.counter > 2500: Theme.setBaseColor(1 - v) text = _("Accuracy: %.1f%%") % self.accuracy[j] w, h = font.getStringSize(text) font.render(text, (.5 - w / 2, .54 + v)) text = _("Longest note streak: %d") % player.longestStreak w, h = font.getStringSize(text) font.render(text, (.5 - w / 2, .54 + h + v)) # self.player.twoChord if player.twoChord > 0: text = _("Part: %s on %s (2 chord)") % (player.part, player.difficulty) else: text = _("Part: %s on %s") % (player.part, player.difficulty) w, h = font.getStringSize(text) font.render(text, (.5 - w / 2, .54 + (2 * h)+ v)) self.engine.view.setViewport(1,0) finally: self.engine.view.setViewport(1,0) self.engine.view.resetProjection()
def render(self, visibility, topMost): SceneClient.render(self, visibility, topMost) font = self.engine.data.font bigFont = self.engine.data.bigFont self.visibility = v = 1.0 - ((1 - visibility)**2) self.engine.view.setOrthogonalProjection(normalize=True) try: # show countdown if self.countdown > 1: Theme.setBaseColor(min(1.0, 3.0 - abs(4.0 - self.countdown))) text = _("Get Ready to Rock") w, h = font.getStringSize(text) font.render(text, (.5 - w / 2, .3)) if self.countdown < 6: scale = 0.002 + 0.0005 * (self.countdown % 1)**3 text = "%d" % (self.countdown) w, h = bigFont.getStringSize(text, scale=scale) Theme.setSelectedColor() bigFont.render(text, (.5 - w / 2, .45 - h / 2), scale=scale) w, h = font.getStringSize(" ") y = .05 - h / 2 - (1.0 - v) * .2 # show song name if self.countdown and self.song: Theme.setBaseColor(min(1.0, 4.0 - abs(4.0 - self.countdown))) Dialogs.wrapText(font, (.05, .05 - h / 2), self.song.info.name + " \n " + self.song.info.artist, rightMargin=.6, scale=0.0015) Theme.setSelectedColor() font.render( "%d" % (self.player.score + self.getExtraScoreForCurrentlyPlayedNotes()), (.6, y)) font.render("%dx" % self.player.getScoreMultiplier(), (.6, y + h)) # show the streak counter and miss message if self.player.streak > 0 and self.song: text = _("%d hit") % self.player.streak factor = 0.0 if self.lastPickPos: diff = self.getSongPosition() - self.lastPickPos if diff > 0 and diff < self.song.period * 2: factor = .25 * (1.0 - (diff / (self.song.period * 2)))**2 factor = (1.0 + factor) * 0.002 tw, th = font.getStringSize(text, scale=factor) font.render(text, (.16 - tw / 2, y + h / 2 - th / 2), scale=factor) elif self.lastPickPos is not None and self.countdown <= 0: diff = self.getSongPosition() - self.lastPickPos alpha = 1.0 - diff * 0.005 if alpha > .1: Theme.setSelectedColor(alpha) glPushMatrix() glTranslate(.1, y + 0.000005 * diff**2, 0) glRotatef(math.sin(self.lastPickPos) * 25, 0, 0, 1) font.render(_("Missed!"), (0, 0)) glPopMatrix() # show the streak balls if self.player.streak >= 30: glColor3f(.5, .5, 1) elif self.player.streak >= 20: glColor3f(1, 1, .5) elif self.player.streak >= 10: glColor3f(1, .5, .5) else: glColor3f(.5, 1, .5) s = min(39, self.player.streak) % 10 + 1 font.render(Data.BALL2 * s + Data.BALL1 * (10 - s), (.67, y + h * 1.3), scale=0.0011) # show multiplier changes if self.song and self.lastMultTime is not None: diff = self.getSongPosition() - self.lastMultTime if diff > 0 and diff < self.song.period * 2: m = self.player.getScoreMultiplier() c = (1, 1, 1) if self.player.streak >= 40: texture = None elif m == 1: texture = None elif m == 2: texture = self.fx2x.texture c = (1, .5, .5) elif m == 3: texture = self.fx3x.texture c = (1, 1, .5) elif m == 4: texture = self.fx4x.texture c = (.5, .5, 1) f = (1.0 - abs(self.song.period * 1 - diff) / (self.song.period * 1))**2 # Flash the screen glBegin(GL_TRIANGLE_STRIP) glColor4f(c[0], c[1], c[2], (f - .5) * 1) glVertex2f(0, 0) glColor4f(c[0], c[1], c[2], (f - .5) * 1) glVertex2f(1, 0) glColor4f(c[0], c[1], c[2], (f - .5) * .25) glVertex2f(0, 1) glColor4f(c[0], c[1], c[2], (f - .5) * .25) glVertex2f(1, 1) glEnd() if texture: glPushMatrix() glEnable(GL_TEXTURE_2D) texture.bind() size = (texture.pixelSize[0] * .002, texture.pixelSize[1] * .002) glTranslatef(.5, .15, 0) glBlendFunc(GL_SRC_ALPHA, GL_ONE) f = .5 + .5 * (diff / self.song.period)**3 glColor4f(1, 1, 1, min(1, 2 - f)) glBegin(GL_TRIANGLE_STRIP) glTexCoord2f(0.0, 0.0) glVertex2f(-size[0] * f, -size[1] * f) glTexCoord2f(1.0, 0.0) glVertex2f(size[0] * f, -size[1] * f) glTexCoord2f(0.0, 1.0) glVertex2f(-size[0] * f, size[1] * f) glTexCoord2f(1.0, 1.0) glVertex2f(size[0] * f, size[1] * f) glEnd() glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) glPopMatrix() # show the comments if self.song and self.song.info.tutorial: glColor3f(1, 1, 1) pos = self.getSongPosition() for time, event in self.song.track.getEvents( pos - self.song.period * 2, pos + self.song.period * 4): if isinstance(event, PictureEvent): if pos < time or pos > time + event.length: continue try: picture = event.picture except: self.engine.loadSvgDrawing( event, "picture", os.path.join(self.libraryName, self.songName, event.fileName)) picture = event.picture w, h, = self.engine.view.geometry[2:4] fadePeriod = 500.0 f = (1.0 - min(1.0, abs(pos - time) / fadePeriod) * min(1.0, abs(pos - time - event.length) / fadePeriod) )**2 picture.transform.reset() picture.transform.translate(w / 2, (f * -2 + 1) * h / 2) picture.transform.scale(1, -1) picture.draw() elif isinstance(event, TextEvent): if pos >= time and pos <= time + event.length: text = _(event.text) w, h = font.getStringSize(text) font.render(text, (.5 - w / 2, .67)) finally: self.engine.view.resetProjection()