# HG changeset patch
# User helios2000@33b003aa-7bff-0310-803a-e67f0ece8222
# Date 1290355094 0
# Node ID 60621d858548beda965e048ff2c4fba9ba7c4503
# Parent 49fb0370f8e1490a6a7ff5ccdc846bf626f03de1
* Fixed the image/animation functions in GenericRenderer and LightRenderer. The functions now consider the camera zoom level.
* Added the forgotten LightEdit plugin for the editor.
diff -r 49fb0370f8e1 -r 60621d858548 engine/core/view/renderers/genericrenderer.cpp
--- a/engine/core/view/renderers/genericrenderer.cpp Thu Nov 18 17:28:15 2010 +0000
+++ b/engine/core/view/renderers/genericrenderer.cpp Sun Nov 21 15:58:14 2010 +0000
@@ -328,10 +328,12 @@
Image* img = &imagepool->getImage(m_image);
Rect r;
Rect viewport = cam->getViewPort();
- r.x = p.x-img->getWidth()/2;
- r.y = p.y-img->getHeight()/2;
- r.w = img->getWidth();
- r.h = img->getHeight();
+ unsigned int widtht = round(img->getWidth() * cam->getZoom());
+ unsigned int height = round(img->getHeight() * cam->getZoom());
+ r.x = p.x-widtht/2;
+ r.y = p.y-height/2;
+ r.w = widtht;
+ r.h = height;
if(r.intersects(viewport))
img->render(r);
}
@@ -352,10 +354,12 @@
Image* img = animation.getFrameByTimestamp(animtime);
Rect r;
Rect viewport = cam->getViewPort();
- r.x = p.x-img->getWidth()/2;
- r.y = p.y-img->getHeight()/2;
- r.w = img->getWidth();
- r.h = img->getHeight();
+ unsigned int widtht = round(img->getWidth() * cam->getZoom());
+ unsigned int height = round(img->getHeight() * cam->getZoom());
+ r.x = p.x-widtht/2;
+ r.y = p.y-height/2;
+ r.w = widtht;
+ r.h = height;
if(r.intersects(viewport))
img->render(r);
}
@@ -397,13 +401,16 @@
if(m_anchor.getLayer() == layer) {
Image* img = &imagepool->getImage(m_image);
Rect r;
- r.x = p.x-m_width/2;
- r.y = p.y-m_height/2;
- r.w = m_width;
- r.h = m_height;
- renderbackend->disableLighting();
- img->render(r);
- renderbackend->enableLighting();
+ Rect viewport = cam->getViewPort();
+ unsigned int widtht = round(m_width * cam->getZoom());
+ unsigned int height = round(m_height * cam->getZoom());
+ r.x = p.x-widtht/2;
+ r.y = p.y-height/2;
+ r.w = widtht;
+ r.h = height;
+ if(r.intersects(viewport)) {
+ img->render(r);
+ }
}
}
diff -r 49fb0370f8e1 -r 60621d858548 engine/core/view/renderers/lightrenderer.cpp
--- a/engine/core/view/renderers/lightrenderer.cpp Thu Nov 18 17:28:15 2010 +0000
+++ b/engine/core/view/renderers/lightrenderer.cpp Sun Nov 21 15:58:14 2010 +0000
@@ -247,10 +247,12 @@
Image* img = &imagepool->getImage(m_image);
Rect r;
Rect viewport = cam->getViewPort();
- r.x = p.x-img->getWidth()/2;
- r.y = p.y-img->getHeight()/2;
- r.w = img->getWidth();
- r.h = img->getHeight();
+ unsigned int widtht = round(img->getWidth() * cam->getZoom());
+ unsigned int height = round(img->getHeight() * cam->getZoom());
+ r.x = p.x-widtht/2;
+ r.y = p.y-height/2;
+ r.w = widtht;
+ r.h = height;
renderbackend->changeBlending(m_src, m_dst);
if(r.intersects(viewport))
img->render(r);
@@ -296,10 +298,12 @@
Image* img = animation.getFrameByTimestamp(animtime);
Rect r;
Rect viewport = cam->getViewPort();
- r.x = p.x-img->getWidth()/2;
- r.y = p.y-img->getHeight()/2;
- r.w = img->getWidth();
- r.h = img->getHeight();
+ unsigned int widtht = round(img->getWidth() * cam->getZoom());
+ unsigned int height = round(img->getHeight() * cam->getZoom());
+ r.x = p.x-widtht/2;
+ r.y = p.y-height/2;
+ r.w = widtht;
+ r.h = height;
renderbackend->changeBlending(m_src, m_dst);
if(r.intersects(viewport))
img->render(r);
@@ -343,10 +347,12 @@
Image* img = &imagepool->getImage(m_image);
Rect r;
Rect viewport = cam->getViewPort();
- r.x = p.x-m_width/2;
- r.y = p.y-m_height/2;
- r.w = m_width;
- r.h = m_height;
+ unsigned int widtht = round(m_width * cam->getZoom());
+ unsigned int height = round(m_height * cam->getZoom());
+ r.x = p.x-widtht/2;
+ r.y = p.y-height/2;
+ r.w = widtht;
+ r.h = height;
renderbackend->changeBlending(m_src, m_dst);
if(r.intersects(viewport))
img->render(r);
@@ -392,8 +398,9 @@
void LightRendererSimpleLightInfo::render(Camera* cam, Layer* layer, RenderList& instances, RenderBackend* renderbackend, ImagePool* imagepool, AnimationPool* animpool) {
Point p = m_anchor.getCalculatedPoint(cam, layer);
if(m_anchor.getLayer() == layer) {
+ double zoom = cam->getZoom();
renderbackend->changeBlending(m_src, m_dst);
- renderbackend->drawLightPrimitive(p, m_intensity, m_radius, m_subdivisions, m_xstretch, m_ystretch, m_red, m_green, m_blue);
+ renderbackend->drawLightPrimitive(p, m_intensity, m_radius, m_subdivisions, m_xstretch * zoom, m_ystretch * zoom, m_red, m_green, m_blue);
}
}
void LightRendererSimpleLightInfo::setStencil(uint8_t stencil_ref, float alpha_ref) {
diff -r 49fb0370f8e1 -r 60621d858548 tools/editor/gui/lightedit.xml
--- a/tools/editor/gui/lightedit.xml Thu Nov 18 17:28:15 2010 +0000
+++ b/tools/editor/gui/lightedit.xml Sun Nov 21 15:58:14 2010 +0000
@@ -1,32 +1,182 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff -r 49fb0370f8e1 -r 60621d858548 tools/editor/plugins/LightEdit.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/editor/plugins/LightEdit.py Sun Nov 21 15:58:14 2010 +0000
@@ -0,0 +1,720 @@
+# -*- coding: utf-8 -*-
+
+# ####################################################################
+# Copyright (C) 2005-2010 by the FIFE team
+# http://www.fifengine.de
+# This file is part of FIFE.
+#
+# FIFE is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License as published by the Free Software Foundation; either
+# version 2.1 of the License, or (at your option) any later version.
+#
+# This library 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
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the
+# Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+# ####################################################################
+
+""" a tool for FIFEdit to test and set lighting """
+
+from fife import fife
+from fife.extensions import pychan
+from fife.extensions.pychan import widgets as widgets
+from fife.extensions.pychan.tools import callbackWithArguments as cbwa
+
+from fife.extensions.fife_timer import Timer
+
+import scripts
+import scripts.plugin as plugin
+from scripts.events import *
+from scripts.gui.action import Action
+
+import os
+try:
+ import xml.etree.cElementTree as ET
+except:
+ import xml.etree.ElementTree as ET
+
+import math
+import random
+
+WHITE = {
+ "r" : 205,
+ "g" : 205,
+ "b" : 205
+}
+OUTLINE_SIZE = 1
+
+DEFAULT_GLOBAL_LIGHT = {
+ "R" : 1.0,
+ "G" : 1.0,
+ "B" : 1.0,
+ "A" : 1.0,
+}
+
+class LightEdit(plugin.Plugin):
+ """ The B{LightEdit} module is a plugin for FIFedit and allows to use Lighting
+
+ current features:
+ - click instance to add SimpleLight, LightImage, LightAnimation
+ - outline highlighting of the selected object
+ - changeing all SimpleLigh values and Image, Animation source
+
+
+ """
+ def __init__(self):
+ self.active = False
+ self._camera = None
+ self._layer = None
+ self._enabled = False
+
+ self._light = {}
+ self._color = {}
+ self._color.update(DEFAULT_GLOBAL_LIGHT)
+
+ random.seed()
+
+ def _reset(self):
+ """
+ resets all dynamic vars, but leaves out static ones (e.g. camera, layer)
+
+ """
+ self._instances = None
+ self._light["stencil"] = -1
+ self._light["alpha"] = 0.0
+ self._light["src"] = -1
+ self._light["dst"] = -1
+
+ self._light["intensity"] = 0
+ self._light["red"] = 0
+ self._light["green"] = 0
+ self._light["blue"] = 0
+ self._light["radius"] = 0
+ self._light["subdivisions"] = 32
+ self._light["xstretch"] = 1
+ self._light["ystretch"] = 1
+
+ self._light["image"] = ""
+ self._light["animation"] = ""
+
+ self._simple_l = False
+ self._image_l = False
+ self._animation_l = False
+ self._global_l = False
+
+ if self._camera is not None:
+ self.renderer.removeAllOutlines()
+ self._widgets["group"].text = unicode(str(""))
+ self._widgets["image"].text = unicode(str(""))
+ self._widgets["animation"].text = unicode(str(""))
+
+ def enable(self):
+ """ plugin method """
+ if self._enabled is True:
+ return
+
+ self._editor = scripts.editor.getEditor()
+ self.engine = self._editor.getEngine()
+
+ self.imagepool = self.engine.getImagePool()
+ self._animationpool = self.engine.getAnimationPool()
+
+ self._showAction = Action(unicode(self.getName(),"utf-8"), checkable=True)
+ scripts.gui.action.activated.connect(self.toggle_gui, sender=self._showAction)
+
+ self._editor._tools_menu.addAction(self._showAction)
+
+ events.onInstancesSelected.connect(self.input)
+
+ self._reset()
+ self.create_gui()
+
+ def disable(self):
+ """ plugin method """
+ if self._enabled is False:
+ return
+
+ self._reset()
+ self.container.hide()
+ self.removeAllChildren()
+
+ events.onInstancesSelected.disconnect(self.input)
+
+ self._editor._toolsMenu.removeAction(self._showAction)
+
+ def isEnabled(self):
+ """ plugin method """
+ return self._enabled;
+
+ def getName(self):
+ """ plugin method """
+ return "Light editor"
+
+ def create_gui(self):
+ """
+ - creates the gui skeleton by loading the xml file
+
+ FIXME:
+ - move all dynamic widgets to dict
+ """
+ self.container = pychan.loadXML('gui/lightedit.xml')
+ self.container.mapEvents({
+ "reset" : self.reset_light,
+ "use" : self.use_light,
+ "simple_but" : self.toggle_simple_gui,
+ "image_but" : self.toggle_image_gui,
+ "animation_but" : self.toggle_animation_gui,
+ "global_but" : self.toggle_global_gui,
+ "selec_image" : self.change_image,
+ "selec_animation" : self.change_animation,
+
+ "stencil_up" : cbwa(self.change_light, value=1, option="stencil"),
+ "stencil_dn" : cbwa(self.change_light, value=-1, option="stencil"),
+ "stencil/mouseWheelMovedUp" : cbwa(self.change_light, value=10, option="stencil"),
+ "stencil/mouseWheelMovedDown" : cbwa(self.change_light, value=-10, option="stencil"),
+
+ "alpha_up" : cbwa(self.change_light, value=0.01, option="alpha"),
+ "alpha_dn" : cbwa(self.change_light, value=-0.01, option="alpha"),
+ "alpha/mouseWheelMovedUp" : cbwa(self.change_light, value=0.1, option="alpha"),
+ "alpha/mouseWheelMovedDown" : cbwa(self.change_light, value=-0.1, option="alpha"),
+
+ "intensity_up" : cbwa(self.change_light, value=1, option="intensity"),
+ "intensity_dn" : cbwa(self.change_light, value=-1, option="intensity"),
+ "intensity/mouseWheelMovedUp" : cbwa(self.change_light, value=10, option="intensity"),
+ "intensity/mouseWheelMovedDown" : cbwa(self.change_light, value=-10, option="intensity"),
+
+ "radius_up" : cbwa(self.change_light, value= 1, option="radius"),
+ "radius_dn" : cbwa(self.change_light, value=-1, option="radius"),
+ "radius/mouseWheelMovedUp" : cbwa(self.change_light, value= 10, option="radius"),
+ "radius/mouseWheelMovedDown" : cbwa(self.change_light, value=-10, option="radius"),
+
+ "subdivisions_up" : cbwa(self.change_light, value= 1, option="subdivisions"),
+ "subdivisions_dn" : cbwa(self.change_light, value=-1, option="subdivisions"),
+ "subdivisions/mouseWheelMovedUp" : cbwa(self.change_light, value= 1, option="subdivisions"),
+ "subdivisions/mouseWheelMovedDown" : cbwa(self.change_light, value=-1, option="subdivisions"),
+
+ "xstretch_up" : cbwa(self.change_light, value= 0.01, option="xstretch"),
+ "xstretch_dn" : cbwa(self.change_light, value=-0.01, option="xstretch"),
+ "xstretch/mouseWheelMovedUp" : cbwa(self.change_light, value= 0.1, option="xstretch"),
+ "xstretch/mouseWheelMovedDown" : cbwa(self.change_light, value=-0.1, option="xstretch"),
+
+ "ystretch_up" : cbwa(self.change_light, value= 0.01, option="ystretch"),
+ "ystretch_dn" : cbwa(self.change_light, value=-0.01, option="ystretch"),
+ "ystretch/mouseWheelMovedUp" : cbwa(self.change_light, value= 0.1, option="ystretch"),
+ "ystretch/mouseWheelMovedDown" : cbwa(self.change_light, value=-0.1, option="ystretch"),
+
+ "red_up" : cbwa(self.change_light, value= 1, option="red"),
+ "red_dn" : cbwa(self.change_light, value=-1, option="red"),
+ "red/mouseWheelMovedUp" : cbwa(self.change_light, value= 10, option="red"),
+ "red/mouseWheelMovedDown" : cbwa(self.change_light, value=-10, option="red"),
+
+ "green_up" : cbwa(self.change_light, value= 1, option="green"),
+ "green_dn" : cbwa(self.change_light, value=-1, option="green"),
+ "green/mouseWheelMovedUp" : cbwa(self.change_light, value= 10, option="green"),
+ "green/mouseWheelMovedDown" : cbwa(self.change_light, value=-10, option="green"),
+
+ "blue_up" : cbwa(self.change_light, value= 1, option="blue"),
+ "blue_dn" : cbwa(self.change_light, value=-1, option="blue"),
+ "blue/mouseWheelMovedUp" : cbwa(self.change_light, value= 10, option="blue"),
+ "blue/mouseWheelMovedDown" : cbwa(self.change_light, value=-10, option="blue"),
+
+ "src_up" : cbwa(self.change_light, value= 1, option="src"),
+ "src_dn" : cbwa(self.change_light, value=-1, option="src"),
+ "src/mouseWheelMovedUp" : cbwa(self.change_light, value= 1, option="src"),
+ "src/mouseWheelMovedDown" : cbwa(self.change_light, value=-1, option="src"),
+
+ "dst_up" : cbwa(self.change_light, value= 1, option="dst"),
+ "dst_dn" : cbwa(self.change_light, value=-1, option="dst"),
+ "dst/mouseWheelMovedUp" : cbwa(self.change_light, value= 1, option="dst"),
+ "dst/mouseWheelMovedDown" : cbwa(self.change_light, value=-1, option="dst"),
+
+ "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.1, r=True),
+ "value_R/mouseWheelMovedDown" : cbwa(self.decrease_color, step=0.1, 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.1, g=True),
+ "value_G/mouseWheelMovedDown" : cbwa(self.decrease_color, step=0.1, 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.1, b=True),
+ "value_B/mouseWheelMovedDown" : cbwa(self.decrease_color, step=0.1, 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.1, a=True),
+ "value_A/mouseWheelMovedDown" : cbwa(self.decrease_color, step=0.1, a=True),
+ })
+
+ self._widgets = {
+ "group" : self.container.findChild(name="group"),
+ "ins_id" : self.container.findChild(name="ins_id"),
+ "obj_id" : self.container.findChild(name="obj_id"),
+ "stencil" : self.container.findChild(name="stencil"),
+ "alpha" : self.container.findChild(name="alpha"),
+
+ "intensity" : self.container.findChild(name="intensity"),
+ "red" : self.container.findChild(name="red"),
+ "green" : self.container.findChild(name="green"),
+ "blue" : self.container.findChild(name="blue"),
+ "radius" : self.container.findChild(name="radius"),
+ "subdivisions" : self.container.findChild(name="subdivisions"),
+ "xstretch" : self.container.findChild(name="xstretch"),
+ "ystretch" : self.container.findChild(name="ystretch"),
+ "src" : self.container.findChild(name="src"),
+ "dst" : self.container.findChild(name="dst"),
+
+ "image" : self.container.findChild(name="image"),
+ "animation" : self.container.findChild(name="animation"),
+
+ "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"),
+ }
+
+ self._gui_simple_panel_wrapper = self.container.findChild(name="simple_panel_wrapper")
+ self._gui_simple_panel = self._gui_simple_panel_wrapper.findChild(name="simple_panel")
+ self._gui_image_panel_wrapper = self.container.findChild(name="image_panel_wrapper")
+ self._gui_image_panel = self._gui_image_panel_wrapper.findChild(name="image_panel")
+ self._gui_animation_panel_wrapper = self.container.findChild(name="animation_panel_wrapper")
+ self._gui_animation_panel = self._gui_animation_panel_wrapper.findChild(name="animation_panel")
+ self._gui_global_panel_wrapper = self.container.findChild(name="global_panel_wrapper")
+ self._gui_global_panel = self._gui_global_panel_wrapper.findChild(name="global_panel")
+
+ def update_gui(self):
+ """
+ updates the gui
+
+ """
+
+ self._widgets["ins_id"].text = unicode(str(self._instances[0].getId()))
+ self._widgets["obj_id"].text = unicode(str(self._instances[0].getObject().getId()))
+ self._widgets["stencil"].text = unicode(str(self._light["stencil"]))
+ self._widgets["alpha"].text = unicode(str(self._light["alpha"]))
+ self._widgets["src"].text = unicode(str(self._light["src"]))
+ self._widgets["dst"].text = unicode(str(self._light["dst"]))
+
+ self._widgets["intensity"].text = unicode(str(self._light["intensity"]))
+ self._widgets["red"].text = unicode(str(self._light["red"]))
+ self._widgets["green"].text = unicode(str(self._light["green"]))
+ self._widgets["blue"].text = unicode(str(self._light["blue"]))
+ self._widgets["radius"].text = unicode(str(self._light["radius"]))
+ self._widgets["subdivisions"].text = unicode(str(self._light["subdivisions"]))
+ self._widgets["xstretch"].text = unicode(str(self._light["xstretch"]))
+ self._widgets["ystretch"].text = unicode(str(self._light["ystretch"]))
+
+ 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"]))
+
+ if self._simple_l:
+ if not self._gui_simple_panel_wrapper.findChild(name="simple_panel"):
+ self._gui_simple_panel_wrapper.addChild(self._gui_simple_panel)
+ else:
+ if self._gui_simple_panel_wrapper.findChild(name="simple_panel"):
+ self._gui_simple_panel_wrapper.removeChild(self._gui_simple_panel)
+ if self._image_l:
+ if not self._gui_image_panel_wrapper.findChild(name="image_panel"):
+ self._gui_image_panel_wrapper.addChild(self._gui_image_panel)
+ else:
+ if self._gui_image_panel_wrapper.findChild(name="image_panel"):
+ self._gui_image_panel_wrapper.removeChild(self._gui_image_panel)
+ if self._animation_l:
+ if not self._gui_animation_panel_wrapper.findChild(name="animation_panel"):
+ self._gui_animation_panel_wrapper.addChild(self._gui_animation_panel)
+ else:
+ if self._gui_animation_panel_wrapper.findChild(name="animation_panel"):
+ self._gui_animation_panel_wrapper.removeChild(self._gui_animation_panel)
+ if self._global_l:
+ if not self._gui_global_panel_wrapper.findChild(name="global_panel"):
+ self._gui_global_panel_wrapper.addChild(self._gui_global_panel)
+ else:
+ if self._gui_global_panel_wrapper.findChild(name="global_panel"):
+ self._gui_global_panel_wrapper.removeChild(self._gui_global_panel)
+
+ self.container.adaptLayout(False)
+
+ def toggle_gui(self):
+ """
+ show / hide the gui
+ """
+ if self.active is True:
+ 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)
+
+ def toggle_simple_gui(self):
+ if self._simple_l:
+ self._simple_l = False
+ else:
+ self._simple_l = True
+ self._image_l = False
+ self._animation_l = False
+ self.update_gui()
+
+ def toggle_image_gui(self):
+ if self._image_l:
+ self._image_l = False
+ else:
+ self._simple_l = False
+ self._image_l = True
+ self._animation_l = False
+ self.update_gui()
+
+ def toggle_animation_gui(self):
+ if self._animation_l:
+ self._animation_l = False
+ else:
+ self._simple_l = False
+ self._image_l = False
+ self._animation_l = True
+ self.update_gui()
+
+ def toggle_global_gui(self):
+ if self._global_l:
+ self._global_l = False
+ else:
+ self._global_l = True
+ self.update_gui()
+
+ def init_data(self):
+ color = self._camera.getLightingColor()
+ self._color["R"] = color[0]
+ self._color["G"] = color[1]
+ self._color["B"] = color[2]
+ self._color["A"] = color[3]
+
+ groups = self.lightrenderer.getGroups()
+ for group in groups:
+ infos = self.lightrenderer.getLightInfo(group)
+ for info in infos:
+ node = info.getNode()
+ if node.getInstance() is None: continue
+ if node.getInstance().getId() == self._instances[0].getId():
+ self._widgets["group"].text = unicode(str(group))
+ self._light["stencil"] = info.getStencil()
+ self._light["alpha"] = info.getAlpha()
+ self._light["src"] = info.getSrcBlend()
+ self._light["dst"] = info.getDstBlend()
+ if str(info.getName()) == "simple":
+ self._light["red"] = info.getColor()[0]
+ self._light["green"] = info.getColor()[1]
+ self._light["blue"] = info.getColor()[2]
+ self._light["intensity"] = info.getColor()[3]
+ self._light["radius"] = info.getRadius()
+ self._light["subdivisions"] = info.getSubdivisions()
+ self._light["xstretch"] = info.getXStretch()
+ self._light["ystretch"] = info.getYStretch()
+ self.toggle_simple_gui()
+ elif str(info.getName()) == "image":
+ if info.getId() == -1: continue
+ img = self.imagepool.getImage(info.getId());
+ name = img.getResourceFile()
+ self._widgets["image"].text = unicode(str(name))
+ self._light["image"] = info.getId()
+ self.toggle_image_gui()
+ elif str(info.getName()) == "animation":
+ if info.getId() == -1: continue
+ ani = self._animationpool.getAnimation(info.getId());
+ count = 0
+ newstr = ''
+ image = ani.getFrame(ani.getActionFrame())
+ fname = image.getResourceFile()
+ strings = ([str(s) for s in fname.split('/')])
+ leng = len(strings) -1
+ while count < leng:
+ newstr = str(newstr + strings[count] + '/')
+ count += 1
+ self._widgets["animation"].text = unicode(str(newstr + 'animation.xml'))
+ self._light["animation"] = info.getId()
+ self.toggle_animation_gui()
+
+ def change_image(self):
+ file = self._editor.getObject().getResourceFile()
+ tree = ET.parse(file)
+ img_lst = tree.findall("image")
+ for image in img_lst:
+ source = image.get('source')
+ path = file.split('/')
+ path.pop()
+ path.append(str(source))
+ self._widgets["image"].text = unicode(str('/'.join(path)))
+ break
+
+ def change_animation(self):
+ file = self._editor.getObject().getResourceFile()
+ tree = ET.parse(file)
+ ani_lst = tree.findall("animation")
+ if not ani_lst:
+ act_lst = tree.findall("action")
+ if not act_lst: return
+ for act in act_lst:
+ ani_lst = act.findall("animation")
+ if ani_lst: break
+
+ for animation in ani_lst:
+ source = animation.get('source')
+ path = file.split('/')
+ path.pop()
+ path.append(str(source))
+ self._widgets["animation"].text = unicode(str('/'.join(path)))
+ break
+
+ def reset_light(self):
+ self._light["stencil"] = -1
+ self._light["alpha"] = 0.0
+ self._light["src"] = -1
+ self._light["dst"] = -1
+
+ self._light["intensity"] = 0
+ self._light["red"] = 0
+ self._light["green"] = 0
+ self._light["blue"] = 0
+ self._light["radius"] = 0
+ self._light["subdivisions"] = 32
+ self._light["xstretch"] = 1
+ self._light["ystretch"] = 1
+
+ self._light["image"] = ""
+ self._light["animation"] = ""
+
+ self.lightrenderer.removeAll(str(self._widgets["group"]._getText()))
+ self._widgets["group"].text = unicode(str(""))
+ self._widgets["image"].text = unicode(str(""))
+ self._widgets["animation"].text = unicode(str(""))
+ self.update_gui()
+
+ def use_light(self):
+ if not self._instances[0]: return
+ counter = 1
+ if self._widgets["ins_id"]._getText() == "":
+ objid = self._instances[0].getObject().getId()
+ insid = str(objid + str(counter))
+ while bool(self._layer.getInstance(insid)):
+ counter = int(counter+1)
+ insid = str(objid + str(counter))
+ self._instances[0].setId(insid)
+
+ if self._light["stencil"] is not -1 and self._light["alpha"] is not 0.0: self.stencil_test()
+ if self._simple_l: self.simple_light()
+ if self._image_l: self.image_light()
+ if self._animation_l: self.animation_light()
+
+ def highlight_selected_instance(self):
+ """ highlights selected instance """
+ self.renderer.removeAllOutlines()
+ self.renderer.addOutlined(self._instances[0], WHITE["r"], WHITE["g"], WHITE["b"], OUTLINE_SIZE)
+
+ def change_light(self, value=0.01, option=None):
+ self._light[option] = self._light[option] + value
+ if self._light[option]+ value < -1 and (option == "src" or option == "dst" or option == "stencil"):
+ self._light[option] = -1
+ if self._light[option]+ value < 0 and option != "src" and option != "dst" and option != "stencil":
+ self._light[option] = 0
+ if self._light[option]+ value > 7 and (option == "src" or option == "dst"):
+ self._light[option] = 7
+ if self._light[option]+ value > 255 and (option == "intensity"
+ or option == "red"
+ or option == "green"
+ or option == "blue"
+ or option == "stencil"):
+ self._light[option] = 255
+ if self._light[option]+ value > 1 and option == "alpha":
+ self._light[option] = 1.0
+
+ self.update_gui()
+
+ def stencil_test(self):
+ self.lightrenderer.addStencilTest(str(self._widgets["group"]._getText()), self._light["stencil"], self._light["alpha"])
+
+ def simple_light(self):
+ if not self._instances[0]: return
+ self.lightrenderer.removeAll(str(self._widgets["group"]._getText()))
+
+ node = fife.LightRendererNode(self._instances[0])
+ self.lightrenderer.addSimpleLight(str(self._widgets["group"]._getText()),
+ node,
+ self._light["intensity"],
+ self._light["radius"],
+ self._light["subdivisions"],
+ self._light["xstretch"],
+ self._light["ystretch"],
+ self._light["red"],
+ self._light["green"],
+ self._light["blue"],
+ self._light["src"],
+ self._light["dst"],)
+
+ def image_light(self):
+ if not self._instances[0]: return
+ self.lightrenderer.removeAll(str(self._widgets["group"]._getText()))
+
+ image = str(self._widgets["image"]._getText())
+ if image == "": return
+ img_id = self.imagepool.addResourceFromFile(image)
+ self._light["image"] = int(img_id)
+ node = fife.LightRendererNode(self._instances[0])
+ self.lightrenderer.addImage(str(self._widgets["group"]._getText()),
+ node,
+ self._light["image"],
+ self._light["src"],
+ self._light["dst"],)
+
+ def animation_light(self):
+ if not self._instances[0]: return
+ self.lightrenderer.removeAll(str(self._widgets["group"]._getText()))
+
+ animation = str(self._widgets["animation"]._getText())
+ if animation == "": return
+ rloc = fife.ResourceLocation(animation)
+ ani_id = self._animationpool.addResourceFromLocation(rloc)
+ self._light["animation"] = int(ani_id)
+ node = fife.LightRendererNode(self._instances[0])
+ self.lightrenderer.addAnimation(str(self._widgets["group"]._getText()),
+ node,
+ self._light["animation"],
+ self._light["src"],
+ self._light["dst"],)
+
+ def reset_global_light(self):
+ """ reset global light to default values (1.0) """
+ 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:
+ if self._color["R"] + step > 1.0:
+ self._color["R"] = 1.0
+ else:
+ self._color["R"] += step
+ if g:
+ if self._color["G"] + step > 1.0:
+ self._color["G"] = 1.0
+ else:
+ self._color["G"] += step
+ if b:
+ if self._color["B"] + step > 1.0:
+ self._color["B"] = 1.0
+ else:
+ self._color["B"] += step
+ if a:
+ if self._color["A"] + step > 1.0:
+ self._color["A"] = 1.0
+ else:
+ 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:
+ if self._color["R"] - step < 0.0:
+ self._color["R"] = 0.0
+ else:
+ self._color["R"] -= step
+ if g:
+ if self._color["G"] - step < 0.0:
+ self._color["G"] = 0.0
+ else:
+ self._color["G"] -= step
+ if b:
+ if self._color["B"] - step < 0.0:
+ self._color["B"] = 0.0
+ else:
+ self._color["B"] -= step
+ if a:
+ if self._color["A"] - step < 0.0:
+ self._color["A"] = 0.0
+ else:
+ self._color["A"] -= step
+
+ self.update_gui()
+ self.set_global_light()
+
+ def random_color(self):
+ """ generate random values for color channels """
+ self._color["R"] = random.uniform(0,1)
+ self._color["G"] = random.uniform(0,1)
+ self._color["B"] = random.uniform(0,1)
+ self._color["A"] = random.uniform(0,1)
+
+ self.update_gui()
+ self.set_global_light()
+
+ def set_global_light(self):
+ """ update the global light with the current set colors """
+ self._camera.setLightingColor(self._color["R"],
+ self._color["G"],
+ self._color["B"],
+ self._color["A"]
+ )
+
+ def input(self, instances):
+ if instances != self._instances:
+ if self.active is True:
+ self._reset()
+ self._instances = instances
+
+ if self._camera is None:
+ self._camera = self._editor.getActiveMapView().getCamera()
+ self.renderer = fife.InstanceRenderer.getInstance(self._camera)
+ self.lightrenderer = fife.LightRenderer.getInstance(self._camera)
+
+ self._layer = self._editor.getActiveMapView().getController()._layer
+
+ if self._instances != ():
+ self.init_data()
+ self.highlight_selected_instance()
+ self.update_gui()
+ self.container.show()
+ else:
+ self._reset()
+ self.container.hide()
+
+ self.container.adaptLayout(False)
diff -r 49fb0370f8e1 -r 60621d858548 tools/editor/scripts/editor.py
--- a/tools/editor/scripts/editor.py Thu Nov 18 17:28:15 2010 +0000
+++ b/tools/editor/scripts/editor.py Sun Nov 21 15:58:14 2010 +0000
@@ -1,7 +1,7 @@
# -*- coding: utf-8 -*-
# ####################################################################
-# Copyright (C) 2005-2009 by the FIFE team
+# Copyright (C) 2005-2010 by the FIFE team
# http://www.fifengine.de
# This file is part of FIFE.
#
@@ -98,7 +98,8 @@
self._change_map = -1
self._settings = TDS
-
+
+ self._lighting_mode = int(TDS.get("FIFE", "Lighting"))
self._help_dialog = None
ApplicationBase.__init__(self, TDS, *args, **kwargs)
@@ -327,7 +328,10 @@
def getSettings(self):
return self._settings;
-
+
+ def getObject(self):
+ return self._mapeditor.getObject()
+
def showMapView(self, mapview):
""" Switches to mapview. """
if mapview is None or mapview == self._mapview:
@@ -340,6 +344,13 @@
for cam in self._mapview.getMap().getCameras():
cam.setEnabled(False)
+ # if light model is set then enable LightRenderer for all layers
+ if self._lighting_mode is not 0:
+ for cam in mapview.getMap().getCameras():
+ renderer = fife.LightRenderer.getInstance(cam)
+ renderer.activateAllLayers(mapview.getMap())
+ renderer.setEnabled(not renderer.isEnabled())
+
events.preMapShown.send(sender=self, mapview=mapview)
self._mapview = mapview
self._mapview.show()
@@ -397,7 +408,10 @@
def openFile(self, path):
""" Opens a file """
try:
- map = loaders.loadMapFile(path, self.engine)
+ if self._lighting_mode == 0:
+ map = loaders.loadMapFile(path, self.engine)
+ else:
+ map = loaders.loadMapFile(path, self.engine, extensions = {'lights': True})
return self.newMapView(map)
except:
traceback.print_exc(sys.exc_info()[1])
diff -r 49fb0370f8e1 -r 60621d858548 tools/editor/scripts/gui/filemanager.py
--- a/tools/editor/scripts/gui/filemanager.py Thu Nov 18 17:28:15 2010 +0000
+++ b/tools/editor/scripts/gui/filemanager.py Sun Nov 21 15:58:14 2010 +0000
@@ -26,6 +26,8 @@
from fife.extensions import pychan
from fife.extensions import filebrowser
from fife.extensions import loaders, savers
+from fife.extensions.serializers.xmlobject import XMLObjectLoader
+from fife.extensions.serializers.xml_loader_tools import loadImportFile, loadImportDir, loadImportDirRec
import action
import scripts.editor
import fife.extensions.pychan.widgets as widgets
@@ -53,6 +55,13 @@
self._importbrowser = None
self._savebrowser = None
+ self.obj_loader = XMLObjectLoader(
+ self.engine.getImagePool(),
+ self.engine.getAnimationPool(),
+ self.engine.getModel(),
+ self.engine.getVFS()
+ )
+
newAction = Action(u"New map", "gui/icons/new_map.png")
loadAction = Action(u"Open", "gui/icons/load_map.png")
closeAction = Action(u"Close", "gui/icons/close_map.png")
@@ -214,7 +223,7 @@
try:
if os.path.isfile(file):
- loaders.loadImportFile(file, self.engine)
+ loadImportFile(self.obj_loader, file, self.engine)
else:
raise file+ " is not a file!"
except:
@@ -239,7 +248,7 @@
try:
if os.path.isdir(path):
- loaders.loadImportDirRec(path, self.engine)
+ loadImportDirRec(self.obj_loader, path, self.engine)
else:
raise file+ " is not a directory!"
except:
diff -r 49fb0370f8e1 -r 60621d858548 tools/editor/scripts/gui/mapeditor.py
--- a/tools/editor/scripts/gui/mapeditor.py Thu Nov 18 17:28:15 2010 +0000
+++ b/tools/editor/scripts/gui/mapeditor.py Sun Nov 21 15:58:14 2010 +0000
@@ -103,7 +103,11 @@
def setObject(self, object):
""" Set the object type to be paint onto map """
self._object = object
-
+
+ def getObject(self):
+ """ Return the current object """
+ return self._object
+
def setController(self, controller):
""" Set the controller to use. """
if self._controller is not None:
diff -r 49fb0370f8e1 -r 60621d858548 tools/editor/settings-dist.xml
--- a/tools/editor/settings-dist.xml Thu Nov 18 17:28:15 2010 +0000
+++ b/tools/editor/settings-dist.xml Sun Nov 21 15:58:14 2010 +0000
@@ -25,6 +25,7 @@
True
True
True
+ True
0,255,0