Пример #1
0
	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));
		}
	}
Пример #2
0
	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);
	}