class Terrain(BaseObject): COLLISION_MASK = CollisionGroup.Terrain HEIGHT = 0.0 def __init__(self): super(Terrain, self).__init__(random_seed=0) shape = BulletPlaneShape(Vec3(0, 0, 1), 0) node = BulletRigidBodyNode(BodyName.Ground) node.setFriction(.9) node.addShape(shape) node.setIntoCollideMask(self.COLLISION_MASK) self.dynamic_nodes.append(node) self.origin.attachNewNode(node) if self.render: self.origin.hide(CamMask.MiniMap | CamMask.Shadow | CamMask.DepthCam | CamMask.ScreenshotCam) # self.terrain_normal = self.loader.loadTexture( # AssetLoader.file_path( "textures", "grass2", "normal.jpg") # ) self.terrain_texture = self.loader.loadTexture( AssetLoader.file_path("textures", "ground.png")) self.terrain_texture.setWrapU(Texture.WM_repeat) self.terrain_texture.setWrapV(Texture.WM_repeat) self.ts_color = TextureStage("color") self.ts_normal = TextureStage("normal") self.ts_normal.set_mode(TextureStage.M_normal) self.origin.setPos(0, 0, self.HEIGHT) cm = CardMaker('card') scale = 20000 cm.setUvRange((0, 0), (scale / 10, scale / 10)) card = self.origin.attachNewNode(cm.generate()) # scale = 1 if self.use_hollow else 20000 card.set_scale(scale) card.setPos(-scale / 2, -scale / 2, -0.1) card.setZ(-.05) card.setTexture(self.ts_color, self.terrain_texture) # card.setTexture(self.ts_normal, self.terrain_normal) self.terrain_texture.setMinfilter( SamplerState.FT_linear_mipmap_linear) self.terrain_texture.setAnisotropicDegree(8) card.setQuat( LQuaternionf(math.cos(-math.pi / 4), math.sin(-math.pi / 4), 0, 0))
def set_drv_txt_img(page, i, car_name, pos_x, top, text, players): drivers = [player.driver for player in players] info('drivers: ' + str([drv for drv in drivers])) info('i: %s - carname: %s - text: %s' % (i, car_name, text)) drv = next(player.driver for player in players if player.car == car_name) player_car_names = [ player.car for player in players if player.kind == Player.human ] is_player_car = car_name in player_car_names info('%s %s %s %s' % (text % drv.name, car_name, drv.img_idx, is_player_car)) name = text % drv.name if '@' in name: name = name.split('@')[0] + '\1smaller\1@' + name.split('@')[1] + \ '\2' txt = Text(name, align='left', scale=.072, pos=(pos_x, top - i * .16), font=page.font, fg=page.text_fg if is_player_car else page.text_bg) gprops = page.rprops.season_props.gameprops img = Img(gprops.cars_img % car_name, pos=(pos_x - .16, top + .02 - i * .16), scale=.074) filtervpath = RankingGui.eng.curr_path + \ 'yyagl/assets/shaders/filter.vert' with open(filtervpath) as fvs: vert = fvs.read() drvfpath = RankingGui.eng.curr_path + \ 'yyagl/assets/shaders/drv_car.frag' with open(drvfpath) as ffs: frag = ffs.read() shader = load_shader(vert, frag) if shader: img.set_shader(shader) img.set_transparent() t_s = TextureStage('ts') t_s.set_mode(TextureStage.MDecal) txt_path = gprops.drivers_img.path_sel % drv.img_idx img.set_texture(t_s, loader.loadTexture(txt_path)) return txt, img
class DriverPageGui(ThanksPageGui): def __init__(self, mediator, driverpage_props, nplayers=1): self.props = driverpage_props self.sel_drv_img = None self.driver = None nplayers = list(range(nplayers)) ThanksPageGui.__init__(self, mediator, driverpage_props.gameprops.menu_props, nplayers) def build(self, exit_behav): self.drv_info = self.props.gameprops.drivers_info menu_props = self.menu_props widgets = [Text(_('Select the driver'), pos=(0, .8), **menu_props.text_args)] t_a = self.menu_props.text_args.copy() del t_a['scale'] self.name = Text(_('Write your name:'), pos=(-.1, .6), scale=.06, align='right', wordwrap=128, **t_a) self.drivers = [] for row, col in product(range(2), range(4)): idx = col + row * 4 drv_btn = ImgBtn( scale=(.24, .24), pos=(-.75 + col * .5, .3 - row * .64), frame_col=(0, 0, 0, 0), img=self.props.gameprops.drivers_img.path % idx, cmd=self.on_click, extra_args=[idx], **self.menu_props.imgbtn_args) name = Text( '', pos=(-.75 + col * .5, .01 - row * .64), scale=.046, **t_a) drv_btn._name_txt = name widgets += [drv_btn, name] self.drivers += [widgets[-2]] sign = lambda pos_x: '\1green\1+\2' if pos_x > 0 else '' psign = lambda pos_x, sgn=sign: '+' if pos_x == 0 else sgn(pos_x) def ppcol(x): return '\1green\1%s\2' % x if x > 0 else '\1red\1%s\2' % x pcol = lambda x: x if x == 0 else ppcol(x) lab_lst = [(_('adherence'), .09), (_('speed'), .21), (_('stability'), .15)] widgets += list(map( lambda lab_def: self._add_lab(*(lab_def + (row, col))), lab_lst)) txt_lst = [(self.drv_info[idx - 1].adherence, .09), (self.drv_info[idx - 1].speed, .21), (self.drv_info[idx - 1].stability, .15)] widgets += list(map( lambda txt_def: self._add_txt( *txt_def + (psign, pcol, col, row)), txt_lst)) self.sel_drv_img = Img( self.props.gameprops.cars_img % self.mediator.car, parent=base.a2dBottomLeft, pos=(.3, .4), scale=.28) instr_txt = _( 'If you use the keyboard, press FIRE to edit the field, then ' "ENTER when you're done") instr = Text(instr_txt, pos=(1.4, .6), scale=.042, wordwrap=16, **t_a) widgets += [self.sel_drv_img, self.name, instr] self.add_widgets(widgets) ffilterpath = self.eng.curr_path + 'yyagl/assets/shaders/filter.vert' with open(ffilterpath) as ffilter: vert = ffilter.read() shader = load_shader(vert, frag) if shader: self.sel_drv_img.set_shader(shader) self.sel_drv_img.set_transparent() self.t_s = TextureStage('ts') self.t_s.set_mode(TextureStage.MDecal) empty_img = PNMImage(1, 1) empty_img.add_alpha() empty_img.alpha_fill(0) tex = Texture() tex.load(empty_img) self.sel_drv_img.set_texture(self.t_s, tex) ThanksPageGui.build(self, exit_behav=exit_behav) def _add_lab(self, txt, pos_z, row, col): t_a = self.menu_props.text_args.copy() del t_a['scale'] return Text( txt + ':', pos=(-.95 + col * .5, pos_z - row * .64), scale=.046, align='left', **t_a) def _add_txt(self, val, pos_z, psign, pcol, col, row): t_a = self.menu_props.text_args.copy() del t_a['scale'] return Text( '%s%s%%' % (psign(val), pcol(val)), pos=(-.55 + col * .5, pos_z - row * .64), scale=.052, align='right', **t_a) def enable_buttons(self, enable): [(drv.enable if enable else drv.disable)() for drv in self.drivers] def on_click(self, i): self.eng.log('selected driver ' + str(i)) gprops = self.props.gameprops txt_path = gprops.drivers_img.path_sel self.sel_drv_img.set_texture(self.t_s, loader.loadTexture(txt_path % i)) self.widgets[-1]['state'] = DISABLED self.enable_buttons(False) taskMgr.remove(self.update_tsk) cars = gprops.cars_names[:] car_idx = cars.index(self.mediator.car) cars.remove(self.mediator.car) shuffle(cars) drv_idx = list(range(8)) drv_idx.remove(i) shuffle(drv_idx) prev_drv = gprops.drivers_info[car_idx] gprops.drivers_info[car_idx] = gprops.drivers_info[i] gprops.drivers_info[car_idx].img_idx = i nname = self.this_name() gprops.drivers_info[car_idx].name = nname gprops.drivers_info[i] = prev_drv self.eng.log('drivers: ' + str(gprops.drivers_info)) self.notify('on_driver_selected', self.ent.text, self.mediator.track, self.mediator.car) def _buttons(self, idx): return [btn for btn in self.buttons if btn['extraArgs'] == [idx]] def destroy(self): self.sel_drv_img = None PageGui.destroy(self)
class DriverPageGui(ThanksPageGui): def __init__(self, mediator, driverpage_props): self.props = driverpage_props self.sel_drv_img = None self.driver = None ThanksPageGui.__init__(self, mediator, driverpage_props.gameprops.menu_args) def build(self, exit_behav): self.drv_info = self.props.gameprops.drivers_info menu_args = self.menu_args widgets = [Text(_('Select the driver'), pos=(-.2, .8), **menu_args.text_args)] t_a = self.menu_args.text_args.copy() del t_a['scale'] self.name = Text(_('Write your name:'), pos=(-.3, .6), scale=.06, align='right', wordwrap=128, **t_a) self.drivers = [] for row, col in product(range(2), range(4)): idx = col + row * 4 drv_btn = ImgBtn( scale=.24, pos=(-.95 + col * .5, 1, .3 - row * .64), frameColor=(0, 0, 0, 0), image=self.props.gameprops.drivers_img.path % idx, command=self.on_click, extraArgs=[idx], **self.menu_args.imgbtn_args) name = Text( '', pos=(-.95 + col * .5, .01 - row * .64), scale=.046, **t_a) drv_btn._name_txt = name widgets += [drv_btn, name] self.drivers += [widgets[-1]] sign = lambda pos_x: '\1green\1+\2' if pos_x > 0 else '' psign = lambda pos_x, sgn=sign: '+' if pos_x == 0 else sgn(pos_x) def ppcol(x): return '\1green\1%s\2' % x if x > 0 else '\1red\1%s\2' % x pcol = lambda x: x if x == 0 else ppcol(x) lab_lst = [(_('adherence'), .09), (_('speed'), .21), (_('stability'), .15)] widgets += map( lambda lab_def: self.__add_lab(*(lab_def + (row, col))), lab_lst) txt_lst = [(self.drv_info[idx - 1].adherence, .09), (self.drv_info[idx - 1].speed, .21), (self.drv_info[idx - 1].stability, .15)] widgets += map( lambda txt_def: self.__add_txt( *txt_def + (psign, pcol, col, row)), txt_lst) self.sel_drv_img = Img( self.props.gameprops.cars_img % self.mediator.car, parent=base.a2dBottomLeft, pos=(.3, 1, .4), scale=.28) widgets += [self.sel_drv_img, self.name] self.add_widgets(widgets) ffilterpath = self.eng.curr_path + 'yyagl/assets/shaders/filter.vert' with open(ffilterpath) as ffilter: vert = ffilter.read() shader = load_shader(vert, frag) if shader: self.sel_drv_img.set_shader(shader) self.sel_drv_img.set_transparency(True) self.t_s = TextureStage('ts') self.t_s.set_mode(TextureStage.MDecal) empty_img = PNMImage(1, 1) empty_img.add_alpha() empty_img.alpha_fill(0) tex = Texture() tex.load(empty_img) self.sel_drv_img.set_texture(self.t_s, tex) ThanksPageGui.build(self, exit_behav=exit_behav) def __add_lab(self, txt, pos_z, row, col): t_a = self.menu_args.text_args.copy() del t_a['scale'] return Text( txt + ':', pos=(-1.15 + col * .5, pos_z - row * .64), scale=.046, align='left', **t_a) def __add_txt(self, val, pos_z, psign, pcol, col, row): t_a = self.menu_args.text_args.copy() del t_a['scale'] return Text( '%s%s%%' % (psign(val), pcol(val)), pos=(-.75 + col * .5, pos_z - row * .64), scale=.052, align='right', **t_a) def enable_buttons(self, enable): [(drv.enable if enable else drv.disable)() for drv in self.drivers] def on_click(self, i): self.eng.log('selected driver ' + str(i)) gprops = self.props.gameprops txt_path = gprops.drivers_img.path_sel self.sel_drv_img.set_texture(self.t_s, loader.loadTexture(txt_path % i)) self.widgets[-1]['state'] = DISABLED self.enable_buttons(False) taskMgr.remove(self.update_tsk) cars = gprops.cars_names[:] car_idx = cars.index(self.mediator.car) cars.remove(self.mediator.car) shuffle(cars) drv_idx = range(8) drv_idx.remove(i) shuffle(drv_idx) prev_drv = gprops.drivers_info[car_idx] gprops.drivers_info[car_idx] = gprops.drivers_info[i] gprops.drivers_info[car_idx].img_idx = i nname = self.this_name() gprops.drivers_info[car_idx].name = nname gprops.drivers_info[i] = prev_drv self.eng.log('drivers: ' + str(gprops.drivers_info)) self.notify('on_driver_selected', self.ent.get(), self.mediator.track, self.mediator.car) def _buttons(self, idx): return [btn for btn in self.buttons if btn['extraArgs'] == [idx]] def destroy(self): self.sel_drv_img = None PageGui.destroy(self)
mat = Material() mat.set_base_color((1.0, 1.0, 1.0, 1)) mat.set_emission((1.0, 1.0, 1.0, 1)) mat.set_metallic(1.0) mat.set_roughness(1.0) card.set_material(mat) texture_size = 256 base_color_pnm = PNMImage(texture_size, texture_size) base_color_pnm.fill(0.72, 0.45, 0.2) # Copper base_color_tex = Texture("BaseColor") base_color_tex.load(base_color_pnm) ts = TextureStage('BaseColor') # a.k.a. Modulate ts.set_mode(TextureStage.M_modulate) card.set_texture(ts, base_color_tex) # Emission; Gets multiplied with mat.emission emission_pnm = PNMImage(texture_size, texture_size) emission_pnm.fill(0.0, 0.0, 0.0) emission_tex = Texture("Emission") emission_tex.load(emission_pnm) ts = TextureStage('Emission') ts.set_mode(TextureStage.M_emission) card.set_texture(ts, emission_tex) # Ambient Occlusion, Roughness, Metallicity # R: Ambient Occlusion # G: Roughness, a.k.a. gloss map (if inverted); Gets multiplied with mat.roughness # B: Metallicity; Gets multiplied with mat.metallic