void Canvas::draw_surface_batch(const SurfacePtr& surface, std::vector<Rectf> srcrects, std::vector<Rectf> dstrects, std::vector<float> angles, const Color& color, int layer) { if (!surface) return; auto request = new(m_obst) TextureRequest(); request->type = TEXTURE; request->layer = layer; request->flip = m_context.transform().flip ^ surface->get_flip(); request->alpha = m_context.transform().alpha; request->color = color; request->srcrects = std::move(srcrects); request->dstrects = std::move(dstrects); request->angles = std::move(angles); for (auto& dstrect : request->dstrects) { dstrect = Rectf(apply_translate(dstrect.p1()), dstrect.get_size()); } request->texture = surface->get_texture().get(); request->displacement_texture = surface->get_displacement_texture().get(); m_requests.push_back(request); }
void Canvas::draw_surface(const SurfacePtr& surface, const Vector& position, float angle, const Color& color, const Blend& blend, int layer) { if (!surface) return; const auto& cliprect = m_context.get_cliprect(); // discard clipped surface if (position.x > cliprect.get_right() || position.y > cliprect.get_bottom() || position.x + static_cast<float>(surface->get_width()) < cliprect.get_left() || position.y + static_cast<float>(surface->get_height()) < cliprect.get_top()) return; auto request = new(m_obst) TextureRequest(); request->type = TEXTURE; request->layer = layer; request->flip = m_context.transform().flip ^ surface->get_flip(); request->alpha = m_context.transform().alpha; request->blend = blend; request->srcrects.emplace_back(Rectf(surface->get_region())); request->dstrects.emplace_back(Rectf(apply_translate(position), Size(surface->get_width(), surface->get_height()))); request->angles.emplace_back(angle); request->texture = surface->get_texture().get(); request->displacement_texture = surface->get_displacement_texture().get(); request->color = color; m_requests.push_back(request); }
void draw_particles() { glPushMatrix(); glMultMatrixf(get_modelview().matrix); OpenGLState state; state.bind_texture(surface->get_texture()); state.set_blend_func(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); state.enable(GL_BLEND); state.activate(); glBegin(GL_QUADS); for(ParticleSystem::Particles::iterator i = psys.begin(); i != psys.end(); ++i) { if (i->t != -1.0f) { float p = 1.0f - psys.get_progress(i->t); Color color(psys.get_color_start().r * p + psys.get_color_stop().r * (1.0f - p), psys.get_color_start().g * p + psys.get_color_stop().g * (1.0f - p), psys.get_color_start().b * p + psys.get_color_stop().b * (1.0f - p), psys.get_color_start().a * p + psys.get_color_stop().a * (1.0f - p)); // scale float scale = psys.get_size_start() + psys.get_progress(i->t) * (psys.get_size_stop() - psys.get_size_start()); float width = surface->get_width() * scale; float height = surface->get_height() * scale; // rotate float x_rot = width/2; float y_rot = height/2; if (i->angle != 0) { float s = sinf(math::pi * i->angle/180.0f); float c = cosf(math::pi * i->angle/180.0f); x_rot = (width/2) * c - (height/2) * s; y_rot = (width/2) * s + (height/2) * c; } glColor4f(color.r, color.g, color.b, color.a); glTexCoord2f(0, 0); glVertex2f(i->x - x_rot, i->y - y_rot); glTexCoord2f(1, 0); glVertex2f(i->x + y_rot, i->y - x_rot); glTexCoord2f(1, 1); glVertex2f(i->x + x_rot, i->y + y_rot); glTexCoord2f(0, 1); glVertex2f(i->x - y_rot, i->y + x_rot); } } glEnd(); glPopMatrix(); }
void Canvas::draw_surface_part(const SurfacePtr& surface, const Rectf& srcrect, const Rectf& dstrect, int layer, const PaintStyle& style) { if (!surface) return; auto request = new(m_obst) TextureRequest(); request->type = TEXTURE; request->layer = layer; request->flip = m_context.transform().flip ^ surface->get_flip(); request->alpha = m_context.transform().alpha * style.get_alpha(); request->blend = style.get_blend(); request->srcrects.emplace_back(srcrect); request->dstrects.emplace_back(apply_translate(dstrect.p1()), dstrect.get_size()); request->angles.emplace_back(0.0f); request->texture = surface->get_texture().get(); request->displacement_texture = surface->get_displacement_texture().get(); request->color = style.get_color(); m_requests.push_back(request); }