Mercurial > fife-parpg
diff clients/editor/plugins/LightEdit.py @ 307:22253b2c9b14
- added LightEdit editor plugin (needs light branch to work; deactivated if lighting renderer is not available)
- added animation viewer to ObjectEdit
- several bugfixes for ObjectEdit plugin
FEATURES:
- ObjectEdit
- viewing and rotating animated instances (rotations are hardcoded for now, FIFE needs to expose available angles to python in order to make animation rotation work for every client)
- LightEdit
- test global light values
author | chewie@33b003aa-7bff-0310-803a-e67f0ece8222 |
---|---|
date | Tue, 11 Aug 2009 15:32:54 +0000 |
parents | |
children | dfd48d49c044 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/clients/editor/plugins/LightEdit.py Tue Aug 11 15:32:54 2009 +0000 @@ -0,0 +1,292 @@ +#!/usr/bin/env python +# coding: utf-8 +# ################################################### +# Copyright (C) 2008 The Zero-Projekt team +# http://zero-projekt.net +# info@zero-projekt.net +# This file is part of Zero "Was vom Morgen blieb" +# +# The Zero-Projekt codebase 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., +# 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# ################################################### + +""" a tool for FIFEdit to test global light """ + +import fife +import pychan +import pychan.widgets as widgets +from pychan.tools import callbackWithArguments as cbwa + +from fife_timer import Timer + +import scripts +import scripts.plugin as plugin +from scripts.events import * +from scripts.gui.action import Action + +import random + +DEFAULT_GLOBAL_LIGHT = { + "R" : 1.0, + "G" : 1.0, + "B" : 1.0, + "A" : 1.0, +} +DEFAULT_LIGHT_ID = "LightEdit" + +class LightEdit(plugin.Plugin): + """ The B{LightEdit} module is a plugin for FIFedit and allows to change the + global light value + + FEATURES: + - enable FIFE lighting renderer + - generate random light values + - test lightsetups by manipulating the color channels + - reset to default + """ + def __init__(self): + self.active = False + + self._renderer = None + self._camera = None + self._enabled = False + self._light = False + + self.map_loaded = False + + self._color = {} + self._color.update(DEFAULT_GLOBAL_LIGHT) + + random.seed() + + if "LightRenderer" in dir(fife): + self._renderer_available = True + else: + self._renderer_available = False + + def _reset(self): + """ resets all dynamic vars """ + pass + + def enable(self): + """ plugin method """ + if not self._renderer_available: + self._enabled = False + return + if self._enabled is True: + return + + self._editor = scripts.editor.getEditor() + self.engine = self._editor.getEngine() + + self._showAction = Action(unicode(self.getName(),"utf-8"), checkable=True) + scripts.gui.action.activated.connect(self.toggle_gui, sender=self._showAction) + + self._editor._toolsMenu.addAction(self._showAction) + + events.postMapShown.connect(self.update_renderer) + events.onMapChanged.connect(self.update_renderer) + + self._reset() + self.create_gui() + + def disable(self): + """ plugin method """ + if self._enabled is False: + return + + self._reset() + self.container.hide() + self.removeAllChildren() + + self._editor._toolsMenu.removeAction(self._showAction) + + events.postMapShown.disconnect(self.update_renderer) + events.onMapChanged.disconnect(self.update_renderer) + + def isEnabled(self): + """ plugin method """ + return self._enabled; + + def getName(self): + """ plugin method """ + return "Light editor" + + def create_gui(self): + """ create gui container and setup callbacks """ + self.container = pychan.loadXML('gui/lightedit.xml') + self.container.mapEvents({ + "enable_global_light" : self.toggle_light, + "random_global_light" : self.random_color, + "reset_global_light" : self.reset_global_light, + + "increase_R" : cbwa(self.increase_color, r=True), + "decrease_R" : cbwa(self.decrease_color, r=True), + "value_R/mouseWheelMovedUp" : cbwa(self.increase_color, step=0.2, r=True), + "value_R/mouseWheelMovedDown" : cbwa(self.decrease_color, step=0.2, r=True), + + "increase_G" : cbwa(self.increase_color, g=True), + "decrease_G" : cbwa(self.decrease_color, g=True), + "value_G/mouseWheelMovedUp" : cbwa(self.increase_color, step=0.2, g=True), + "value_G/mouseWheelMovedDown" : cbwa(self.decrease_color, step=0.2, g=True), + + "increase_B" : cbwa(self.increase_color, b=True), + "decrease_B" : cbwa(self.decrease_color, b=True), + "value_B/mouseWheelMovedUp" : cbwa(self.increase_color, step=0.2, b=True), + "value_B/mouseWheelMovedDown" : cbwa(self.decrease_color, step=0.2, b=True), + + "increase_A" : cbwa(self.increase_color, a=True), + "decrease_A" : cbwa(self.decrease_color, a=True), + "value_A/mouseWheelMovedUp" : cbwa(self.increase_color, step=0.2, a=True), + "value_A/mouseWheelMovedDown" : cbwa(self.decrease_color, step=0.2, a=True), + }) + self._widgets = { + "enable_global_light" : self.container.findChild(name="enable_global_light"), + "random_global_light" : self.container.findChild(name="random_global_light"), + "reset_global_light" : self.container.findChild(name="reset_global_light"), + + "value_R" : self.container.findChild(name="value_R"), + "value_G" : self.container.findChild(name="value_G"), + "value_B" : self.container.findChild(name="value_B"), + "value_A" : self.container.findChild(name="value_A"), + } + + def toggle_gui(self): + """ show / hide the gui """ + if self.active: + self.active = False + if self.container.isVisible() or self.container.isDocked(): + self.container.setDocked(False) + self.container.hide() + self._showAction.setChecked(False) + else: + self.active = True + self._showAction.setChecked(True) + self.container.show() + + def toggle_light(self): + """ toggle light on / off """ + if not self._renderer: + self._widgets['enable_global_light']._setToggled(False) + return + + if self._light: + self._light = False + self.reset_global_light() + self._renderer.setEnabled(False) + else: + self._light = True + self._renderer.setEnabled(True) + + def update_renderer(self): + """ sets current camera and renderer + bound to FIFedit core (updated on map change) + """ + self._camera = self._editor.getActiveMapView().getCamera() + self._renderer = fife.LightRenderer.getInstance(self._camera) + + def update_gui(self): + """ update gui widgets according to plugin data """ + self._widgets["value_R"].text = unicode(str(self._color["R"])) + self._widgets["value_G"].text = unicode(str(self._color["G"])) + self._widgets["value_B"].text = unicode(str(self._color["B"])) + self._widgets["value_A"].text = unicode(str(self._color["A"])) + + def reset_global_light(self): + """ reset global light to default values (1.0) """ + if not self._renderer: return + + self._color.update(DEFAULT_GLOBAL_LIGHT) + self.update_gui() + self.set_global_light() + + def increase_color(self, step=0.1, r=None, g=None, b=None, a=None): + """ increase a given color value by step value + + @type step float + @param step the step for changing the color channel + @type r bool + @param r flag to alter red color value + @type g bool + @param g flag to alter green color value + @type b bool + @param b flag to alter blue color value + @type a bool + @type a flag to alter alpha channel value (no effect atm) + """ + if r: + self._color["R"] += step + if g: + self._color["G"] += step + if b: + self._color["B"] += step + if a: + self._color["A"] += step + + self.update_gui() + self.set_global_light() + + def decrease_color(self, step=0.1, r=None, g=None, b=None, a=None): + """ decrease a given color value by step value + + @type step float + @param step the step for changing the color channel + @type r bool + @param r flag to alter red color value + @type g bool + @param g flag to alter green color value + @type b bool + @param b flag to alter blue color value + @type a bool + @type a flag to alter alpha channel value (no effect atm) + """ + if r: + self._color["R"] -= step + if g: + self._color["G"] -= step + if b: + self._color["B"] -= step + if a: + self._color["A"] -= step + + self.update_gui() + self.set_global_light() + + def random_color(self): + """ generate random values for color channels """ + if not self._renderer: return + + self._color["R"] = random.uniform(0,2) + self._color["G"] = random.uniform(0,2) + self._color["B"] = random.uniform(0,2) + self._color["A"] = random.uniform(0,2) + + self.update_gui() + self.set_global_light() + + def set_global_light(self): + """ update the global light with the current set colors """ + if not self._renderer: return + + self._renderer.removeAll(DEFAULT_LIGHT_ID) + self._renderer.setglobalLight( + DEFAULT_LIGHT_ID, + 1, + self._color["R"], + self._color["G"], + self._color["B"], + self._color["A"] + ) +