# HG changeset patch # User helios2000@33b003aa-7bff-0310-803a-e67f0ece8222 # Date 1278049774 0 # Node ID 716fbe02140ac91ee6bb530ec0ec292e3f5fe980 # Parent da381ecca97ddc156f7f7bbbdc9839b26eb6f5f4 * Moved the layer visibility and transparency, from instancerenderer.cpp to layercache.cpp and improved it. Note: Now you can set a instance completely opaque, when their layer is fully transparent or reverse. If both have a transparent value then the result from layer-instance is used. diff -r da381ecca97d -r 716fbe02140a engine/core/view/layercache.cpp --- a/engine/core/view/layercache.cpp Wed Jun 30 04:57:35 2010 +0000 +++ b/engine/core/view/layercache.cpp Fri Jul 02 05:49:34 2010 +0000 @@ -283,6 +283,10 @@ void LayerCache::update(Camera::Transform transform, RenderList& renderlist) { const double OVERDRAW = 2.5; renderlist.clear(); + if(!m_layer->areInstancesVisible()) { + FL_DBG(_log, "Layer instances hidden"); + return; + } bool isWarped = transform == Camera::WarpedTransform; if( isWarped ) fullUpdate(); @@ -296,6 +300,7 @@ viewport.y = std::min(viewport_a.y, viewport_b.y); viewport.w = std::max(viewport_a.x, viewport_b.x) - viewport.x; viewport.h = std::max(viewport_a.y, viewport_b.y) - viewport.y; + unsigned char layer_trans = m_layer->getLayerTransparency(); // FL_LOG(_log, LMsg("camera-update viewport") << viewport); std::vector index_list; @@ -313,8 +318,24 @@ RenderItem& item = m_instances[entry.instance_index]; InstanceVisual* visual = item.instance->getVisual(); bool visible = visual->isVisible(); - if(!item.image || !visible) + unsigned char instance_trans = visual->getTransparency(); + if(!item.image || !visible || (instance_trans == 255 && layer_trans == 0) + || (instance_trans == 0 && layer_trans == 255)) { continue; + } + + if(layer_trans != 0) { + if(instance_trans != 0) { + short calc_trans = layer_trans - instance_trans; + if(calc_trans >= 0) { + instance_trans = calc_trans; + } else { + instance_trans = 0; + } + } else { + instance_trans = layer_trans; + } + } Point3D screen_point = m_camera->virtualScreenToScreen(item.screenpoint); // NOTE: @@ -328,6 +349,8 @@ item.dimensions.w = item.bbox.w; item.dimensions.h = item.bbox.h; + item.transparency = 255 - instance_trans; + if (zoom != 1.0) { // NOTE: Due to image alignment, there is additional additions on image dimensions // There's probabaly some better solution for this, but works "good enough" for now. diff -r da381ecca97d -r 716fbe02140a engine/core/view/renderers/instancerenderer.cpp --- a/engine/core/view/renderers/instancerenderer.cpp Wed Jun 30 04:57:35 2010 +0000 +++ b/engine/core/view/renderers/instancerenderer.cpp Fri Jul 02 05:49:34 2010 +0000 @@ -106,12 +106,6 @@ } void InstanceRenderer::render(Camera* cam, Layer* layer, RenderList& 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) { @@ -125,36 +119,24 @@ for (;instance_it != instances.end(); ++instance_it) { FL_DBG(_log, "Iterating instances..."); Instance* instance = (*instance_it)->instance; - InstanceVisual* visual = instance->getVisual(); RenderItem& vc = **instance_it; - 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; - } 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, 255-trans); + bindOutline(outline_it->second, vc, cam)->render(vc.dimensions, vc.transparency); } 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, 255-trans); + bindColoring(coloring_it->second, vc, cam)->render(vc.dimensions, vc.transparency); continue; // Skip normal rendering after drawing overlay } } - vc.image->render(vc.dimensions, 255-trans); + vc.image->render(vc.dimensions, vc.transparency); } } diff -r da381ecca97d -r 716fbe02140a engine/core/view/renderitem.h --- a/engine/core/view/renderitem.h Wed Jun 30 04:57:35 2010 +0000 +++ b/engine/core/view/renderitem.h Fri Jul 02 05:49:34 2010 +0000 @@ -64,6 +64,9 @@ // current facing angle int facing_angle; + + // current transparency + unsigned char transparency; private: int m_cached_static_img_id; int m_cached_static_img_angle;