/usr/lib/python2.7/dist-packages/soya/label3d.py is in python-soya 0.15~rc1-10.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 | # -*- indent-tabs-mode: t -*-
#! /usr/bin/python -O
# Game Skeleton
# Copyright (C) 2003-2004 Jean-Baptiste LAMY
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# Soya gaming tutorial, lesson 5
# Adding jumping
# New stuff is in the Controller and Character class
# A bunch of import
import soya
import soya.widget as widget
import soya.opengl as opengl
class Label3D(soya.PythonCoordSyst):
"""Label3D -- a 2D label displayed at a 3D position
Label3Ds can be added in Worlds.
Attributes :
- text
- font
- size : scales the label. With size = 1.0, a 3D unit corresponds to 1 pixel of the font,
which is probably not what you expect, and thus the default value is 0.01. You can increase
size to get a bigger label ; if the text is pixelised you should use a bigger font.
- lit (default 1) : if false, disable lighting effects
- center_x : -1 : texte is ragged left
0 : texte is centered horizontally
1 : texte is ragged right
- center_y : -1 : texte is ragged top
0 : texte is centered vertically
1 : texte is ragged bottom
- auto_flip : if true (=default), automatically flip the text if the camera looks at the back
of the text.
"""
def __init__(self, parent = None, text = "", font = None, size = 0.01):
soya.PythonCoordSyst.__init__(self, parent)
self._text = text
self._font = font or widget.default_font
self._size = size
self._lit = 1
self._color = soya.WHITE
self._center_x = 0
self._center_y = 0
self.auto_flip = 1
self._display_list = soya.DisplayList()
self._changed = -2
def __setstate__(self, state):
soya.PythonCoordSyst.__setstate__(self, state)
self._changed = -2
def get_font (self): return self._font
def set_font (self, x): self._font = x; self._changed = -2
def get_color (self): return self._color
def set_color (self, x): self._color = x; self._changed = -2
def get_text (self): return self._text
def set_text (self, x): self._text = x; self._changed = -2
def get_lit (self): return self._lit
def set_lit (self, x): self._lit = x; self._changed = -2
def get_size (self): return self._size
def set_size (self, x): self._size = x; self._changed = -2
def get_center_x (self): return self._center_x
def set_center_x (self, x): self._center_x = x; self._changed = -2
def get_center_y (self): return self._center_y
def set_center_y (self, y): self._center_y = y; self._changed = -2
def get_auto_flip(self): return self._auto_flip
def set_auto_flip(self, y): self._auto_flip = y; self._changed = -2
font = property(get_font , set_font )
color = property(get_color, set_color)
text = property(get_text , set_text )
lit = property(get_lit , set_lit )
size = property(get_size , set_size )
center_x = property(get_center_x, set_center_x)
center_y = property(get_center_y, set_center_y)
auto_flip = property(get_auto_flip, set_auto_flip)
def batch(self): return 2, self, None
def render(self):
soya.DEFAULT_MATERIAL.activate()
if self._changed != self._font._pixels_height:
self._font.create_glyphs(self._text)
opengl.glNewList(self._display_list.id, opengl.GL_COMPILE_AND_EXECUTE)
self.build_display_list()
opengl.glEndList()
self._changed = self._font._pixels_height
else:
opengl.glCallList(self._display_list.id)
def build_display_list(self):
if not self.lit: opengl.glDisable(opengl.GL_LIGHTING)
opengl.glColor4f(*self._color)
opengl.glScalef(self._size, -self._size, 1.0)
w, h = self._font.get_print_size(self._text)
if self.center_x == 0: opengl.glTranslatef(-w / 2.0, 0.0, 0.0)
elif self.center_x == 1: opengl.glTranslatef(-w , 0.0, 0.0)
if self.center_y == 0: opengl.glTranslatef(0.0, -h / 2.0, 0.0)
elif self.center_y == 1: opengl.glTranslatef(0.0, -h , 0.0)
if self._auto_flip:
opengl.glEnable(opengl.GL_CULL_FACE)
self._font.draw(self._text, 0.0, 0.0, 0.0, 1)
opengl.glTranslatef(w, 0.0, 0.0)
opengl.glScalef(-1.0, 1.0, 1.0)
self._font.draw(self._text, 0.0, 0.0, 0.0, 1)
opengl.glDisable(opengl.GL_CULL_FACE)
else:
self._font.draw(self._text, 0.0, 0.0, 0.0)
opengl.glEnable(opengl.GL_BLEND) # Font.draw calls glDisable(GL_BLEND)
if not self.lit: opengl.glEnable(opengl.GL_LIGHTING)
# Hack to make it partly saveable
#def __getstate__(self):
# state = soya.PythonCoordSyst.__getstate__(self)
# state[1]["_font"] = None
# return state
if __name__ == "__main__":
import sys, os, os.path
# Inits Soya
soya.init()
# Define data path (=where to find models, textures, ...)
HERE = os.path.dirname(sys.argv[0])
soya.path.append(os.path.join(HERE, "data"))
# Create the scene (a world with no parent)
scene = soya.World()
label = Label3D(scene, "Test bla bla bla bla")
label.x = 0.0
label.lit = 0
camera = soya.Camera(scene)
camera.z = 4.0
camera.back = 1000.0
# Creates a widget group, containing the camera and a label showing the FPS.
soya.set_root_widget(widget.Group())
soya.root_widget.add(camera)
soya.root_widget.add(widget.FPSLabel())
# Creates and run an "main_loop" (=an object that manage time and regulate FPS)
# By default, FPS is locked at 40.
soya.MainLoop(scene).main_loop()
|