// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "mojo/examples/sample_app/gles2_client_impl.h" #include #include #include #include #include "mojo/public/c/gles2/gles2.h" #include "ui/events/event_constants.h" namespace mojo { namespace examples { namespace { float CalculateDragDistance(const gfx::PointF& start, const Point& end) { return hypot(start.x() - end.x, start.y() - end.y); } float GetRandomColor() { return static_cast(rand()) / static_cast(RAND_MAX); } } GLES2ClientImpl::GLES2ClientImpl(CommandBufferPtr command_buffer) : getting_animation_frames_(false) { context_ = MojoGLES2CreateContext( command_buffer.PassMessagePipe().release().value(), &ContextLostThunk, &DrawAnimationFrameThunk, this); MojoGLES2MakeCurrent(context_); } GLES2ClientImpl::~GLES2ClientImpl() { MojoGLES2DestroyContext(context_); } void GLES2ClientImpl::SetSize(const Size& size) { size_ = gfx::Size(size.width, size.height); if (size_.IsEmpty()) return; cube_.Init(size_.width(), size_.height()); RequestAnimationFrames(); } void GLES2ClientImpl::HandleInputEvent(const Event& event) { switch (event.action) { case ui::ET_MOUSE_PRESSED: case ui::ET_TOUCH_PRESSED: if (event.flags & ui::EF_RIGHT_MOUSE_BUTTON) break; CancelAnimationFrames(); capture_point_.SetPoint(event.location->x, event.location->y); last_drag_point_ = capture_point_; drag_start_time_ = GetTimeTicksNow(); break; case ui::ET_MOUSE_DRAGGED: case ui::ET_TOUCH_MOVED: if (event.flags & ui::EF_RIGHT_MOUSE_BUTTON) break; if (!getting_animation_frames_) { int direction = event.location->y < last_drag_point_.y() || event.location->x > last_drag_point_.x() ? 1 : -1; cube_.set_direction(direction); cube_.UpdateForDragDistance( CalculateDragDistance(last_drag_point_, *event.location)); cube_.Draw(); MojoGLES2SwapBuffers(); last_drag_point_.SetPoint(event.location->x, event.location->y); } break; case ui::ET_MOUSE_RELEASED: case ui::ET_TOUCH_RELEASED: { if (event.flags & ui::EF_RIGHT_MOUSE_BUTTON) { cube_.set_color(GetRandomColor(), GetRandomColor(), GetRandomColor()); break; } MojoTimeTicks offset = GetTimeTicksNow() - drag_start_time_; float delta = static_cast(offset) / 1000000.; cube_.SetFlingMultiplier( CalculateDragDistance(capture_point_, *event.location), delta); capture_point_ = last_drag_point_ = gfx::PointF(); RequestAnimationFrames(); break; } default: break; } } void GLES2ClientImpl::ContextLost() { CancelAnimationFrames(); } void GLES2ClientImpl::ContextLostThunk(void* closure) { static_cast(closure)->ContextLost(); } void GLES2ClientImpl::DrawAnimationFrame() { MojoTimeTicks now = GetTimeTicksNow(); MojoTimeTicks offset = now - last_time_; float delta = static_cast(offset) / 1000000.; last_time_ = now; cube_.UpdateForTimeDelta(delta); cube_.Draw(); MojoGLES2SwapBuffers(); } void GLES2ClientImpl::DrawAnimationFrameThunk(void* closure) { static_cast(closure)->DrawAnimationFrame(); } void GLES2ClientImpl::RequestAnimationFrames() { getting_animation_frames_ = true; MojoGLES2RequestAnimationFrames(context_); last_time_ = GetTimeTicksNow(); } void GLES2ClientImpl::CancelAnimationFrames() { getting_animation_frames_ = false; MojoGLES2CancelAnimationFrames(context_); } } // namespace examples } // namespace mojo