# HG changeset patch
# User prock@33b003aa-7bff-0310-803a-e67f0ece8222
# Date 1253816687 0
# Node ID ab41334e8a578925e87a3e68ebf741b06eb3868b
# Parent 8b125ec749d74900c822f48db1cc8bd4a795cef3
Added or1andov's code with a few adjustments to fix instance transparencies fixed[t:378]
Added layer transparency support
Added layer transparency to map editor
diff -r 8b125ec749d7 -r ab41334e8a57 clients/editor/gui/layerdialog.xml
--- a/clients/editor/gui/layerdialog.xml Tue Sep 22 19:03:53 2009 +0000
+++ b/clients/editor/gui/layerdialog.xml Thu Sep 24 18:24:47 2009 +0000
@@ -29,6 +29,10 @@
+
+
+
+
diff -r 8b125ec749d7 -r ab41334e8a57 clients/editor/scripts/gui/layerdialog.py
--- a/clients/editor/scripts/gui/layerdialog.py Tue Sep 22 19:03:53 2009 +0000
+++ b/clients/editor/scripts/gui/layerdialog.py Thu Sep 24 18:24:47 2009 +0000
@@ -58,7 +58,8 @@
"yScaleBox" : unicode(cg.getYScale()),
"rotBox" : unicode(cg.getRotation()),
"xOffsetBox" : unicode(cg.getXShift()),
- "yOffsetBox" : unicode(cg.getYShift())
+ "yOffsetBox" : unicode(cg.getYShift()),
+ "transBox" : unicode(layer.getLayerTransparency())
})
self._widget.findChild(name="pathingBox").selected = int(layer.getPathingStrategy())
@@ -108,6 +109,19 @@
print 'Please enter integer or decimal value for rotation.'
return
+ try:
+ transparency = int(self._widget.collectData('transBox'))
+ except ValueError:
+ print 'Please enter an integer value in the range of 0-255 for transparency.'
+ return
+
+
+ #Clamp the transparency value between 0 and 255
+ if transparency < 0:
+ transparency = 0
+ if transparency > 255:
+ transparency = 255
+
grid_type = int(self._widget.collectData('gridBox'))
pathing = int(self._widget.collectData('pathingBox'))
@@ -147,6 +161,7 @@
return
layer.setPathingStrategy(pathing)
+ layer.setLayerTransparency(transparency)
self.engine.getView().resetRenderers()
diff -r 8b125ec749d7 -r ab41334e8a57 clients/rio_de_hola/maps/shrine.xml
--- a/clients/rio_de_hola/maps/shrine.xml Tue Sep 22 19:03:53 2009 +0000
+++ b/clients/rio_de_hola/maps/shrine.xml Thu Sep 24 18:24:47 2009 +0000
@@ -60,7 +60,7 @@
-
+
@@ -4740,7 +4740,7 @@
-
+
@@ -5176,7 +5176,7 @@
-
+
diff -r 8b125ec749d7 -r ab41334e8a57 engine/core/model/structures/layer.cpp
--- a/engine/core/model/structures/layer.cpp Tue Sep 22 19:03:53 2009 +0000
+++ b/engine/core/model/structures/layer.cpp Thu Sep 24 18:24:47 2009 +0000
@@ -44,6 +44,7 @@
: m_id(identifier),
m_map(map),
m_instances_visibility(true),
+ m_transparency(0),
m_instanceTree(new InstanceTree()),
m_grid(grid),
m_pathingstrategy(CELL_EDGES_ONLY),
@@ -63,10 +64,10 @@
Instance* Layer::createInstance(Object* object, const ModelCoordinate& p, const std::string& id) {
ExactModelCoordinate emc(static_cast(p.x), static_cast(p.y), static_cast(p.z));
- return createInstance(object, emc, id);
+ return createInstance(object, emc, id);
}
- Instance* Layer::createInstance(Object* object, const ExactModelCoordinate& p, const std::string& id) {
+ Instance* Layer::createInstance(Object* object, const ExactModelCoordinate& p, const std::string& id) {
Location l;
l.setLayer(this);
l.setExactLayerCoordinates(p);
@@ -74,7 +75,7 @@
Instance* instance = new Instance(object, l, id);
m_instances.push_back(instance);
m_instanceTree->addInstance(instance);
-
+
std::vector::iterator i = m_changelisteners.begin();
while (i != m_changelisteners.end()) {
(*i)->onInstanceCreate(this, instance);
@@ -83,13 +84,13 @@
m_changed = true;
return instance;
}
-
+
bool Layer::addInstance(Instance* instance, const ExactModelCoordinate& p){
if( !instance ){
FL_ERR(_log, "Tried to add an instance to layer, but given instance is invalid");
return false;
}
-
+
Location l;
l.setLayer(this);
l.setExactLayerCoordinates(p);
@@ -105,14 +106,14 @@
m_changed = true;
return true;
}
-
+
void Layer::deleteInstance(Instance* instance) {
std::vector::iterator i = m_changelisteners.begin();
while (i != m_changelisteners.end()) {
(*i)->onInstanceDelete(this, instance);
++i;
}
-
+
std::vector::iterator it = m_instances.begin();
for(; it != m_instances.end(); ++it) {
if(*it == instance) {
@@ -168,7 +169,7 @@
if (!layer) {
layer = this;
}
-
+
bool first_found = false;
for (std::vector::const_iterator i = m_instances.begin(); i != m_instances.end(); ++i) {
if (!first_found) {
@@ -177,19 +178,19 @@
first_found = true;
} else {
ModelCoordinate coord = (*i)->getLocationRef().getLayerCoordinates(layer);
-
+
if(coord.x < min.x) {
min.x = coord.x;
}
-
+
if(coord.x > max.x) {
max.x = coord.x;
}
-
+
if(coord.y < min.y) {
min.y = coord.y;
}
-
+
if(coord.y > max.y) {
max.y = coord.y;
}
@@ -204,6 +205,15 @@
void Layer::setInstancesVisible(bool vis) {
m_instances_visibility = vis;
}
+
+ void Layer::setLayerTransparency(uint8_t transparency) {
+ m_transparency = transparency;
+ }
+
+ uint8_t Layer::getLayerTransparency() {
+ return m_transparency;
+ }
+
void Layer::toggleInstancesVisible() {
m_instances_visibility = !m_instances_visibility;
}
@@ -242,7 +252,7 @@
m_changed = false;
return retval;
}
-
+
void Layer::addChangeListener(LayerChangeListener* listener) {
m_changelisteners.push_back(listener);
}
diff -r 8b125ec749d7 -r ab41334e8a57 engine/core/model/structures/layer.h
--- a/engine/core/model/structures/layer.h Tue Sep 22 19:03:53 2009 +0000
+++ b/engine/core/model/structures/layer.h Thu Sep 24 18:24:47 2009 +0000
@@ -51,33 +51,33 @@
*
* CELL_EDGES_ONLY allows pather to use only cell edges when moving instances from cell to cell on map
* CELL_EDGES_AND_DIAGONALS allows pather to use both cell edges and diagonals when moving instances from cell to cell on map
- * FREEFORM allows pather to find shortest route regardless of cellgrid used on the layer
+ * FREEFORM allows pather to find shortest route regardless of cellgrid used on the layer
*/
enum PathingStrategy {
CELL_EDGES_ONLY,
CELL_EDGES_AND_DIAGONALS,
FREEFORM
};
-
+
/** Listener interface for changes happening on a layer
*/
class LayerChangeListener {
public:
virtual ~LayerChangeListener() {};
-
+
/** Called when some instance is changed on layer. @see InstanceChangeType
* @param layer where change occurred
* @param changedInstances list of instances containing some changes
* @note Does not report creations and deletions
*/
virtual void onLayerChanged(Layer* layer, std::vector& changedInstances) = 0;
-
+
/** Called when some instance gets created on layer
* @param layer where change occurred
* @param instance which got created
*/
virtual void onInstanceCreate(Layer* layer, Instance* instance) = 0;
-
+
/** Called when some instance gets deleted on layer
* @param layer where change occurred
* @param instance which will be deleted
@@ -85,8 +85,8 @@
*/
virtual void onInstanceDelete(Layer* layer, Instance* instance) = 0;
};
-
-
+
+
/** A basic layer on a map
*/
class Layer : public ResourceClass {
@@ -122,7 +122,7 @@
*/
void setCellGrid(CellGrid* grid) { m_grid = grid; }
- /** Get the instance tree.
+ /** Get the instance tree.
* @return this layers instance tree.
*/
InstanceTree* getInstanceTree(void) const { return m_instanceTree; }
@@ -139,12 +139,12 @@
/** Add an instance of an object at a specific position
*/
Instance* createInstance(Object* object, const ExactModelCoordinate& p, const std::string& id="");
-
+
/** Add a valid instance at a specific position. This is temporary. It will be moved to a higher level
later so that we can ensure that each Instance only lives in one layer.
*/
bool addInstance(Instance* instance, const ExactModelCoordinate& p);
-
+
/** Remove an instance from the layer
*/
void deleteInstance(Instance* object);
@@ -171,6 +171,15 @@
*/
void setInstancesVisible(bool vis);
+ /** Sets the transparency of all instances on the layer. 0=opaque, 255=transparent
+ * @parm transparency Transparency value from 0-255.
+ */
+ void setLayerTransparency(uint8_t transparency);
+
+ /** Returns the layer's transparency value
+ */
+ uint8_t getLayerTransparency();
+
/** Retrieves the minimum/maximum coordinates of instances on the layer.
* @param min A reference to a ModelCoordinate that will hold the minimum coordinate.
* @param max A reference to a ModelCoordinate that will hold the maximum coordinate.
@@ -199,31 +208,31 @@
* @returns true if layer was changed since the last update, false otherwise
*/
bool update();
-
+
/** Sets pathing strategy for the layer
* @see PathingStrategy
*/
void setPathingStrategy(PathingStrategy strategy) { m_pathingstrategy = strategy; }
-
+
/** Gets pathing strategy for the layer
* @see PathingStrategy
*/
PathingStrategy getPathingStrategy() const { return m_pathingstrategy; }
-
+
/** Adds new change listener
* @param listener to add
*/
void addChangeListener(LayerChangeListener* listener);
-
+
/** Removes associated change listener
* @param listener to remove
*/
void removeChangeListener(LayerChangeListener* listener);
-
+
/** Returns true, if layer information was changed during previous update round
*/
bool isChanged() { return m_changed; }
-
+
/** Returns instances that were changed during previous update round.
* @note does not contain created or deleted instances
*/
@@ -236,24 +245,26 @@
bool m_instances_visibility;
+ uint8_t m_transparency;
+
// all the instances on this layer
std::vector m_instances;
-
+
//The instance tree
InstanceTree* m_instanceTree;
// layer's cellgrid
CellGrid* m_grid;
-
+
// pathing strategy for the layer
PathingStrategy m_pathingstrategy;
-
+
// listeners for layer changes
std::vector m_changelisteners;
-
+
// holds changed instances after each update
std::vector m_changedinstances;
-
+
// true if layer (or it's instance) information was changed during previous update round
bool m_changed;
};
diff -r 8b125ec749d7 -r ab41334e8a57 engine/core/model/structures/layer.i
--- a/engine/core/model/structures/layer.i Tue Sep 22 19:03:53 2009 +0000
+++ b/engine/core/model/structures/layer.i Thu Sep 24 18:24:47 2009 +0000
@@ -77,6 +77,8 @@
Instance* getInstance(const std::string& id);
void setInstancesVisible(bool vis);
+ void setLayerTransparency(uint8_t transparency);
+ uint8_t getLayerTransparency();
bool cellContainsBlockingInstance(const ModelCoordinate& cellCoordinate);
void toggleInstancesVisible();
bool areInstancesVisible() const;
diff -r 8b125ec749d7 -r ab41334e8a57 engine/core/view/renderers/instancerenderer.cpp
--- a/engine/core/view/renderers/instancerenderer.cpp Tue Sep 22 19:03:53 2009 +0000
+++ b/engine/core/view/renderers/instancerenderer.cpp Thu Sep 24 18:24:47 2009 +0000
@@ -54,34 +54,34 @@
namespace FIFE {
static Logger _log(LM_VIEWVIEW);
- InstanceRenderer::OutlineInfo::OutlineInfo():
- r(0),
- g(0),
- b(0),
- width(1),
- outline(NULL),
+ InstanceRenderer::OutlineInfo::OutlineInfo():
+ r(0),
+ g(0),
+ b(0),
+ width(1),
+ outline(NULL),
curimg(NULL) {
}
InstanceRenderer::ColoringInfo::ColoringInfo():
- r(0),
- g(0),
- b(0),
+ r(0),
+ g(0),
+ b(0),
overlay(NULL),
curimg(NULL) {
}
-
- InstanceRenderer::OutlineInfo::~OutlineInfo() {
+
+ InstanceRenderer::OutlineInfo::~OutlineInfo() {
delete outline;
}
-
+
InstanceRenderer::ColoringInfo::~ColoringInfo() {
delete overlay;
}
-
+
InstanceRenderer* InstanceRenderer::getInstance(IRendererContainer* cnt) {
return dynamic_cast(cnt->getRenderer("InstanceRenderer"));
}
-
+
InstanceRenderer::InstanceRenderer(RenderBackend* renderbackend, int position, ImagePool* imagepool, AnimationPool* animpool):
RendererBase(renderbackend, position),
m_imagepool(imagepool),
@@ -102,21 +102,21 @@
InstanceRenderer::~InstanceRenderer() {
}
-
+
void InstanceRenderer::render(Camera* cam, Layer* layer, std::vector& instances) {
// patch #335 by abeyer
if (!layer->areInstancesVisible()) {
FL_DBG(_log, "Layer instances hidden");
return;
}
-
+
FL_DBG(_log, "Iterating layer...");
CellGrid* cg = layer->getCellGrid();
if (!cg) {
FL_WARN(_log, "No cellgrid assigned to layer, cannot draw instances");
return;
}
-
+
const bool any_effects = !(m_instance_outlines.empty() && m_instance_colorings.empty());
std::vector::const_iterator instance_it = instances.begin();
@@ -124,46 +124,59 @@
FL_DBG(_log, "Iterating instances...");
Instance* instance = (*instance_it);
InstanceVisual* visual = instance->getVisual();
+
+ unsigned char trans = visual->getTransparency();
+
+ /**
+ * the instance transparency value take precedence. If it's 0 use the layer trans
+ *
+ * \todo Instances cannot be completely opaque when their layer's transparency is non zero.
+ */
+ if (trans == 0) {
+ unsigned char layer_trans = layer->getLayerTransparency();
+ trans = layer_trans;
+ }
+
InstanceVisualCacheItem& vc = visual->getCacheItem(cam);
FL_DBG(_log, LMsg("Instance layer coordinates = ") << instance->getLocationRef().getLayerCoordinates());
-
+
if (any_effects) {
InstanceToOutlines_t::iterator outline_it = m_instance_outlines.find(instance);
if (outline_it != m_instance_outlines.end()) {
- bindOutline(outline_it->second, vc, cam)->render(vc.dimensions);
+ bindOutline(outline_it->second, vc, cam)->render(vc.dimensions, 255-trans);
}
-
+
InstanceToColoring_t::iterator coloring_it = m_instance_colorings.find(instance);
if (coloring_it != m_instance_colorings.end()) {
- bindColoring(coloring_it->second, vc, cam)->render(vc.dimensions);
+ bindColoring(coloring_it->second, vc, cam)->render(vc.dimensions, 255-trans);
continue; // Skip normal rendering after drawing overlay
}
}
-
- vc.image->render(vc.dimensions);
+
+ vc.image->render(vc.dimensions, 255-trans);
}
}
-
+
Image* InstanceRenderer::bindOutline(OutlineInfo& info, InstanceVisualCacheItem& vc, Camera* cam) {
if (info.curimg == vc.image) {
return info.outline;
} else {
info.curimg = vc.image;
}
-
+
if (info.outline) {
delete info.outline; // delete old mask
info.outline = NULL;
}
SDL_Surface* surface = vc.image->getSurface();
SDL_Surface* outline_surface = SDL_ConvertSurface(surface, surface->format, surface->flags);
-
+
// needs to use SDLImage here, since GlImage does not support drawing primitives atm
SDLImage* img = new SDLImage(outline_surface);
-
+
// TODO: optimize...
uint8_t r, g, b, a = 0;
-
+
// vertical sweep
for (unsigned int x = 0; x < img->getWidth(); x ++) {
uint8_t prev_a = 0;
@@ -202,7 +215,7 @@
prev_a = a;
}
}
-
+
// In case of OpenGL backend, SDLImage needs to be converted
info.outline = m_renderbackend->createImage(img->detachSurface());
delete img;
@@ -221,12 +234,12 @@
}
SDL_Surface* surface = vc.image->getSurface();
SDL_Surface* overlay_surface = SDL_ConvertSurface(surface, surface->format, surface->flags);
-
+
// needs to use SDLImage here, since GlImage does not support drawing primitives atm
SDLImage* img = new SDLImage(overlay_surface);
-
+
uint8_t r, g, b, a = 0;
-
+
for (unsigned int x = 0; x < img->getWidth(); x ++) {
for (unsigned int y = 0; y < img->getHeight(); y ++) {
vc.image->getPixelRGBA(x, y, &r, &g, &b, &a);
@@ -235,7 +248,7 @@
}
}
}
-
+
// In case of OpenGL backend, SDLImage needs to be converted
info.overlay = m_renderbackend->createImage(img->detachSurface());
delete img;
@@ -248,7 +261,7 @@
info.g = g;
info.b = b;
info.width = width;
-
+
m_instance_outlines[instance] = info;
}
@@ -257,29 +270,29 @@
info.r = r;
info.g = g;
info.b = b;
-
+
m_instance_colorings[instance] = info;
}
void InstanceRenderer::removeOutlined(Instance* instance) {
m_instance_outlines.erase(instance);
}
-
+
void InstanceRenderer::removeColored(Instance* instance) {
m_instance_colorings.erase(instance);
}
-
+
void InstanceRenderer::removeAllOutlines() {
m_instance_outlines.clear();
}
-
+
void InstanceRenderer::removeAllColored() {
m_instance_colorings.clear();
}
-
+
void InstanceRenderer::reset() {
removeAllOutlines();
removeAllColored();
}
-
+
}
diff -r 8b125ec749d7 -r ab41334e8a57 engine/core/view/visual.h
--- a/engine/core/view/visual.h Tue Sep 22 19:03:53 2009 +0000
+++ b/engine/core/view/visual.h Thu Sep 24 18:24:47 2009 +0000
@@ -38,7 +38,7 @@
class Instance;
class Action;
class Image;
-
+
/** Base class for all 2 dimensional visual classes
* Visual classes are extensions to visualize the stuff in model (e.g. instances)
* The reason why its separated is to keep model view-agnostic, so that we could
@@ -49,35 +49,35 @@
/** Destructor
*/
virtual ~Visual2DGfx();
-
+
/** Sets transparency value for object to be visualized
* @param stackposition new stack position
*/
void setTransparency(uint8_t transparency) { m_transparency = transparency; }
-
+
/** Gets current transparency value (0-255)
* @return current transparency value
*/
unsigned int getTransparency() { return m_transparency; }
-
+
/** Sets visibility value for object to be visualized
* @param visible is object visible or not
*/
void setVisible(bool visible) { m_visible = visible; }
-
+
/** Is instance visible or not
* @return is instance visible or not
*/
unsigned int isVisible() { return m_visible; }
-
+
protected:
/** Constructor
*/
Visual2DGfx();
-
+
uint8_t m_transparency;
uint8_t m_visible;
-
+
};
/** Object visual contains data that is needed for visualizing objects
@@ -87,11 +87,11 @@
/** Constructs and assigns it to the passed item
*/
static ObjectVisual* create(Object* object);
-
+
/** Destructor
*/
virtual ~ObjectVisual();
-
+
/** Adds new static image with given angle (degrees)
* Static images are used in case there are no actions active in the instance
* There can be several static images for different angles, that are used in
@@ -102,26 +102,26 @@
@param image_index index of image to use for given degress
*/
void addStaticImage(unsigned int angle, int image_index);
-
+
/** Returns closest matching static image for given angle
* @return id for static image
*/
int getStaticImageIndexByAngle(int angle);
-
+
/** Returns closest matching image angle for given angle
* @return closest matching angle
*/
int getClosestMatchingAngle(int angle);
-
+
/** Returns list of available static image angles for this object
*/
void getStaticImageAngles(std::vector& angles);
-
+
private:
/** Constructor
*/
ObjectVisual();
-
+
type_angle2id m_angle2img;
};
@@ -132,23 +132,23 @@
class InstanceVisualCacheItem {
public:
InstanceVisualCacheItem();
-
+
/** Returns closest matching static image for given angle
* @return id for static image
* @see ObjectVisual::getStaticImageIndexByAngle
*/
int getStaticImageIndexByAngle(unsigned int angle, Instance* instance);
-
+
// point where instance was drawn during the previous render
ScreenPoint screenpoint;
-
+
// dimensions of this visual during the previous render
Rect dimensions;
-
+
// image used during previous render
Image* image;
-
- // current facing angle
+
+ // current facing angle
int facing_angle;
private:
int m_cached_static_img_id;
@@ -162,28 +162,28 @@
/** Constructs and assigns it to the passed item
*/
static InstanceVisual* create(Instance* instance);
-
+
/** Destructor
*/
virtual ~InstanceVisual();
-
+
/** Sets stack position of the instance
* Stack position is used to define the order in which instances residing
* in the same location are drawn
* @param stackposition new stack position
*/
void setStackPosition(int stackposition) { m_stackposition = stackposition; }
-
+
/** Gets current stack position of instance
* @return current stack position
*/
int getStackPosition() { return m_stackposition; }
-
+
/** Get camera specific cache item for the visual
* @return cache item
*/
inline InstanceVisualCacheItem& getCacheItem(Camera* cam) { return m_cache[cam]; }
-
+
private:
/** Constructor
*/
@@ -192,7 +192,7 @@
// there is separate cache item for each camera
std::map m_cache;
};
-
+
/** Action visual contains data that is needed to visualize different actions on screen
*/
class ActionVisual: public Visual2DGfx {
@@ -200,29 +200,29 @@
/** Constructs and assigns it to the passed item
*/
static ActionVisual* create(Action* action);
-
+
/** Destructor
*/
virtual ~ActionVisual();
-
+
/** Adds new animation with given angle (degrees)
*/
void addAnimation(unsigned int angle, int animation_index);
-
+
/** Gets index to animation closest to given angle
* @return animation index, -1 if no animations available
*/
int getAnimationIndexByAngle(int angle);
-
+
private:
/** Constructor
*/
ActionVisual();
-
+
// animations associated with this action (handles to pool)
// mapping = direction -> animation
type_angle2id m_animations;
};
-
+
}
#endif
diff -r 8b125ec749d7 -r ab41334e8a57 engine/core/view/visual.i
--- a/engine/core/view/visual.i Tue Sep 22 19:03:53 2009 +0000
+++ b/engine/core/view/visual.i Thu Sep 24 18:24:47 2009 +0000
@@ -29,7 +29,7 @@
public:
virtual ~Visual2DGfx();
void setTransparency(uint8_t transparency);
- unsigned int getTransparency();
+ uint8_t getTransparency();
void setVisible(bool visible);
unsigned int isVisible();
private:
diff -r 8b125ec749d7 -r ab41334e8a57 engine/extensions/savers.py
--- a/engine/extensions/savers.py Tue Sep 22 19:03:53 2009 +0000
+++ b/engine/extensions/savers.py Thu Sep 24 18:24:47 2009 +0000
@@ -160,6 +160,7 @@
(None, 'x_offset'): str(cellgrid.getXShift()),
(None, 'y_offset'): str(cellgrid.getYShift()),
(None, 'pathing'): self.pathing_val_to_str(layer.getPathingStrategy()),
+ (None, 'transparency'): str(layer.getLayerTransparency()),
}
attr_names = {
(None, 'id'): 'id',
diff -r 8b125ec749d7 -r ab41334e8a57 engine/extensions/serializers/xmlmap.py
--- a/engine/extensions/serializers/xmlmap.py Tue Sep 22 19:03:53 2009 +0000
+++ b/engine/extensions/serializers/xmlmap.py Thu Sep 24 18:24:47 2009 +0000
@@ -157,13 +157,18 @@
x_offset = layer.get('x_offset')
y_offset = layer.get('y_offset')
pathing = layer.get('pathing')
-
+ transparency = layer.get('transparency')
+
if not x_scale: x_scale = 1.0
if not y_scale: y_scale = 1.0
if not rotation: rotation = 0.0
if not x_offset: x_offset = 0.0
if not y_offset: y_offset = 0.0
if not pathing: pathing = "cell_edges_only"
+ if not transparency:
+ transparency = 0
+ else:
+ transparency = int(transparency)
if not id: self._err(' declared with no id attribute.')
if not grid_type: self._err(''.join(['Layer ', str(id), ' has no grid_type attribute.']))
@@ -192,6 +197,8 @@
strgy = fife.FREEFORM
layer_obj.setPathingStrategy(strgy)
+ layer_obj.setLayerTransparency(transparency)
+
self.parse_instances(layer, layer_obj)
if self.callback is not None: