| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- // Copyright 2016 The G3N Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- package camera
- import (
- "github.com/g3n/engine/math32"
- )
- // Orthographic is an orthographic camera.
- type Orthographic struct {
- Camera // Embedded camera
- left float32 // left plane x coordinate
- right float32 // right plane x coordinate
- top float32 // top plane y coordinate
- bottom float32 // bottom plane y coordinate
- near float32 // near plane z coordinate
- far float32 // far plane z coordinate
- zoom float32
- projChanged bool // camera projection parameters changed (needs to recalculate projection matrix)
- projMatrix math32.Matrix4 // last calculated projection matrix
- }
- // NewOrthographic creates and returns a pointer to a new orthographic camera with the specified parameters.
- func NewOrthographic(left, right, top, bottom, near, far float32) *Orthographic {
- cam := new(Orthographic)
- cam.Camera.Initialize()
- cam.left = left
- cam.right = right
- cam.top = top
- cam.bottom = bottom
- cam.near = near
- cam.far = far
- cam.zoom = 1.0
- cam.projChanged = true
- return cam
- }
- // SetAspect sets the camera aspect ratio (width/height).
- func (cam *Orthographic) SetAspect(aspect float32) {
- height := cam.top - cam.bottom
- halfwidth := height * aspect * 0.5
- center := (cam.left + cam.right) * 0.5
- cam.left = center - halfwidth
- cam.right = center + halfwidth
- cam.projChanged = true
- }
- // SetZoom sets the zoom factor of the camera.
- func (cam *Orthographic) SetZoom(zoom float32) {
- cam.zoom = math32.Abs(zoom)
- cam.projChanged = true
- }
- // Zoom returns the zoom factor of the camera.
- func (cam *Orthographic) Zoom() float32 {
- return cam.zoom
- }
- // Planes returns the coordinates of the camera planes.
- func (cam *Orthographic) Planes() (left, right, top, bottom, near, far float32) {
- return cam.left, cam.right, cam.top, cam.bottom, cam.near, cam.far
- }
- // ProjMatrix satisfies the ICamera interface.
- func (cam *Orthographic) ProjMatrix(m *math32.Matrix4) {
- if cam.projChanged {
- cam.projMatrix.MakeOrthographic(cam.left/cam.zoom, cam.right/cam.zoom, cam.top/cam.zoom, cam.bottom/cam.zoom, cam.near, cam.far)
- cam.projChanged = false
- }
- *m = cam.projMatrix
- }
|