void WorldViewer::addToRender(SceneRenderer &renderer) const { vector<int> inds; inds.reserve(8192); const TileMap &tile_map = m_world->tileMap(); tile_map.findAll(inds, renderer.targetRect(), Flags::all | Flags::visible); for(int n = 0; n < (int)inds.size(); n++) tile_map[inds[n]].ptr->addToRender(renderer, (int3)tile_map[inds[n]].bbox.min); for(int n = 0; n < (int)m_entities.size(); n++) { const VisEntity &vis_entity = m_entities[n]; if(vis_entity.mode == VisEntity::invisible) continue; float blend_value = 1.0f; if(vis_entity.mode == VisEntity::blending_in) blend_value = vis_entity.blend_value / blend_time; else if(vis_entity.mode == VisEntity::blending_out) blend_value = 1.0f - vis_entity.blend_value / blend_time; const Entity *entity = vis_entity.mode == VisEntity::shadowed? vis_entity.shadow.get() : m_world->refEntity(vis_entity.ref); if(entity && m_occluder_config.isVisible(vis_entity.occluder_id)) entity->addToRender(renderer, (IColor)FColor(1.0f, 1.0f, 1.0f, blend_value)); } }
void Entity::addToRender(SceneRenderer &out, Color color) const { //PROFILE("Entity::addToRender"); IRect rect = m_sprite.getRect(m_seq_idx, m_frame_idx, m_dir_idx); if(!areOverlapping(out.targetRect(), rect + (int2)worldToScreen(m_pos))) return; FBox bbox = boundingBox() - pos(); if(shrinkRenderedBBox() && bbox.height() >= 2.0f) bbox = {float3(bbox.x(), min(bbox.y() + 1.0f, bbox.ey() - 0.5f), bbox.z()), bbox.max()}; bool as_overlay = renderAsOverlay(); FRect tex_rect; auto tex = m_sprite.getFrame(m_seq_idx, m_frame_idx, m_dir_idx, tex_rect); bool added = out.add(tex, rect, m_pos, bbox, color, tex_rect, as_overlay); if(added && m_oseq_idx != -1 && m_oframe_idx != -1) { //TODO: overlay may be visible, while normal sprite is not! rect = m_sprite.getRect(m_oseq_idx, m_oframe_idx, m_dir_idx); auto ov_tex = m_sprite.getFrame(m_oseq_idx, m_oframe_idx, m_dir_idx, tex_rect); out.add(ov_tex, rect, m_pos, bbox, color, tex_rect, true); } // if(findAny(boundingBox(), {Flags::all | Flags::colliding, ref()})) // out.addBox(bbox + pos(), ColorId::red); }