blob: 792ea1f26a754b0c4583bcd11a87859292e10ea9 [file] [log] [blame]
/*
* Copyright 2017 Google Inc. All Rights Reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef COBALT_DOM_CAMERA_3D_H_
#define COBALT_DOM_CAMERA_3D_H_
#include "base/timer.h"
#include "cobalt/dom/event_target.h"
#include "cobalt/input/camera_3d.h"
#include "cobalt/script/wrappable.h"
namespace cobalt {
namespace dom {
// 3D camera is used for setting the key mapping.
class Camera3D : public script::Wrappable {
public:
enum CameraAxes {
// Restricted to [0deg, 360deg]
kDomCameraRoll = input::Camera3D::kCameraRoll,
// Restricted to [-90deg, 90deg]
kDomCameraPitch = input::Camera3D::kCameraPitch,
// Restricted to [0deg, 360deg]
kDomCameraYaw = input::Camera3D::kCameraYaw,
};
// The frequency at which Camera3D will poll the hardware implementation.
// Effectively the maximum frequency at which orientation events will be
// dispatched.
static constexpr double ORIENTATION_POLL_FREQUENCY_HZ = 30.0;
// The minimum frequency at which Camera3D will dispatch events. Its inverse
// is the most that will elapse between dispatching consecutive events (might
// not be true in practice due to other processing done on the web thread).
static constexpr double ORIENTATION_EVENT_MIN_FREQUENCY_HZ = 0.5;
// The minimum change in any of the angles that will trigger an event. The
// above frequencies still have precedence to decide the timing.
static constexpr double ORIENTATION_EVENT_DELTA_THRESHOLD_DEGREES = 0.5;
explicit Camera3D(const scoped_refptr<input::Camera3D>& impl);
// Creates a mapping between the specified keyCode and the specified camera
// axis, such that while the key is pressed, the cameraAxis will rotate at a
// constant rate of degrees_per_second.
void CreateKeyMapping(int keycode, uint32 camera_axis,
float degrees_per_second);
// Clears any key mapping associated with the specified keyCode, if they
// exist.
void ClearKeyMapping(int keycode);
// Clears all key mappings created by previous calls to |CreateKeyMapping|.
void ClearAllKeyMappings();
// Resets the camera's orientation.
void Reset();
// Custom, not in any spec.
scoped_refptr<input::Camera3D> impl() { return impl_; }
void StartOrientationEvents(const base::WeakPtr<EventTarget>& target);
void StopOrientationEvents();
DEFINE_WRAPPABLE_TYPE(Camera3D);
private:
void FireOrientationEvent(const base::WeakPtr<EventTarget> target);
// We delegate all calls to the implementation of Camera3D so that all camera
// state is stored within an object that is *not* a script::Wrappable. This
// is important because input::Camera3D will typically be attached to a render
// tree, and render trees passed to the rasterizer have the potential to
// outlive the WebModule that created them, and input::Camera3D is designed
// for just this.
scoped_refptr<input::Camera3D> impl_;
// State to control the polling and event firing rate.
base::RepeatingTimer<Camera3D> orientation_event_timer_;
base::optional<base::TimeTicks> last_event_time_;
double last_event_alpha_;
double last_event_beta_;
double last_event_gamma_;
DISALLOW_COPY_AND_ASSIGN(Camera3D);
};
} // namespace dom
} // namespace cobalt
#endif // COBALT_DOM_CAMERA_3D_H_