Server LuaCsForBarotrauma
Camera.cs
1 using Microsoft.Xna.Framework;
2 using System;
3 //TODO: this class still does things that the server doesn't need, cleanup
4 
5 namespace Barotrauma
6 {
7  public class Camera
8  {
9  public static Camera Instance = new Camera();
10 
11  public static bool FollowSub = true;
12 
13  const float DefaultZoom = 1.0f;
14  const float ZoomSmoothness = 8.0f;
15  const float MoveSmoothness = 8.0f;
16 
17  private float zoom;
18 
19  private float offsetAmount;
20 
21  private Matrix transform, shaderTransform, viewMatrix;
22  private Vector2 position;
23  private float rotation;
24 
25  private Vector2 prevPosition;
26  private float prevZoom;
27 
28  public float Shake;
29  private Vector2 shakePosition;
30  private Vector2 shakeTargetPosition;
31 
32  //the area of the world inside the camera view
33  private Rectangle worldView;
34 
35  private Point resolution;
36 
37  private Vector2 targetPos;
38 
39  public float Zoom
40  {
41  get { return zoom; }
42  set
43  {
44  zoom = value;
45 
46  Vector2 center = WorldViewCenter;
47  float newWidth = resolution.X / zoom;
48  float newHeight = resolution.Y / zoom;
49 
50  worldView = new Rectangle(
51  (int)(center.X - newWidth / 2.0f),
52  (int)(center.Y + newHeight / 2.0f),
53  (int)newWidth,
54  (int)newHeight);
55 
56  //UpdateTransform();
57  }
58  }
59 
60  public float Rotation
61  {
62  get { return rotation; }
63  set { rotation = value; }
64  }
65 
66  public float OffsetAmount
67  {
68  get { return offsetAmount; }
69  set { offsetAmount = value; }
70  }
71 
72  public Point Resolution
73  {
74  get { return resolution; }
75  }
76 
77  public Rectangle WorldView
78  {
79  get { return worldView; }
80  }
81 
82  public Vector2 WorldViewCenter
83  {
84  get
85  {
86  return new Vector2(
87  worldView.X + worldView.Width / 2.0f,
88  worldView.Y - worldView.Height / 2.0f);
89  }
90  }
91 
92  public Matrix Transform
93  {
94  get { return transform; }
95  }
96 
97  public Matrix ShaderTransform
98  {
99  get { return shaderTransform; }
100  }
101 
102  public Camera()
103  {
104  zoom = 1.0f;
105  rotation = 0.0f;
106  position = Vector2.Zero;
107 
108  worldView = new Rectangle(0,0,
109  1,
110  1);
111 
112  resolution = new Point(1,1);
113 
114  viewMatrix =
115  Matrix.CreateTranslation(new Vector3(0.5f, 0.5f, 0));
116 
117  UpdateTransform();
118  }
119 
120  public Vector2 TargetPos
121  {
122  get { return targetPos; }
123  set { targetPos = value; }
124  }
125 
126  public Vector2 GetPosition()
127  {
128  return position;
129  }
130 
131  // Auxiliary function to move the camera
132  public void Translate(Vector2 amount)
133  {
134  position += amount;
135  }
136 
137  public void UpdateTransform(bool interpolate = true, bool clampPos = false)
138  {
139  Vector2 interpolatedPosition = interpolate ? Timing.Interpolate(prevPosition, position) : position;
140 
141  float interpolatedZoom = interpolate ? Timing.Interpolate(prevZoom, zoom) : zoom;
142 
143  worldView.X = (int)(interpolatedPosition.X - worldView.Width / 2.0);
144  worldView.Y = (int)(interpolatedPosition.Y + worldView.Height / 2.0);
145 
146  if (Level.Loaded != null && clampPos)
147  {
148  position.Y -= Math.Max(worldView.Y - Level.Loaded.Size.Y, 0.0f);
149  interpolatedPosition.Y -= Math.Max(worldView.Y - Level.Loaded.Size.Y, 0.0f);
150 
151  worldView.Y = Math.Min((int)Level.Loaded.Size.Y, worldView.Y);
152  }
153 
154  transform = Matrix.CreateTranslation(
155  new Vector3(-interpolatedPosition.X, interpolatedPosition.Y, 0)) *
156  Matrix.CreateScale(new Vector3(interpolatedZoom, interpolatedZoom, 1)) *
157  viewMatrix;
158 
159  shaderTransform = Matrix.CreateTranslation(
160  new Vector3(
161  -interpolatedPosition.X - resolution.X / interpolatedZoom / 2.0f,
162  -interpolatedPosition.Y - resolution.Y / interpolatedZoom / 2.0f, 0)) *
163  Matrix.CreateScale(new Vector3(interpolatedZoom, interpolatedZoom, 1)) *
164  viewMatrix;
165 
166  if (!interpolate)
167  {
168  prevPosition = position;
169  prevZoom = zoom;
170  }
171  }
172 
173  public void MoveCamera(float deltaTime, bool allowMove = true, bool allowZoom = true)
174  {
175  return;
176  }
177 
178  public Vector2 Position
179  {
180  get { return position; }
181  set
182  {
183  if (!MathUtils.IsValid(value))
184  {
185  return;
186  }
187  position = value;
188  }
189  }
190 
191  public Vector2 ScreenToWorld(Vector2 coords)
192  {
193  Vector2 worldCoords = Vector2.Transform(coords, Matrix.Invert(transform));
194  return new Vector2(worldCoords.X, -worldCoords.Y);
195  }
196 
197  public Vector2 WorldToScreen(Vector2 coords)
198  {
199  coords.Y = -coords.Y;
200  //Vector2 screenCoords = Vector2.Transform(coords, transform);
201  return Vector2.Transform(coords, transform);
202  }
203  }
204 }
Vector2 WorldToScreen(Vector2 coords)
Definition: Camera.cs:197
Vector2 GetPosition()
Definition: Camera.cs:126
static Camera Instance
Definition: Camera.cs:9
void MoveCamera(float deltaTime, bool allowMove=true, bool allowZoom=true)
Definition: Camera.cs:173
Matrix Transform
Definition: Camera.cs:93
float Rotation
Definition: Camera.cs:61
Point Resolution
Definition: Camera.cs:73
Vector2 ScreenToWorld(Vector2 coords)
Definition: Camera.cs:191
float OffsetAmount
Definition: Camera.cs:67
Vector2 Position
Definition: Camera.cs:179
Rectangle WorldView
Definition: Camera.cs:78
static bool FollowSub
Definition: Camera.cs:11
void UpdateTransform(bool interpolate=true, bool clampPos=false)
Definition: Camera.cs:137
void Translate(Vector2 amount)
Definition: Camera.cs:132
Vector2 WorldViewCenter
Definition: Camera.cs:83
Vector2 TargetPos
Definition: Camera.cs:121
Matrix ShaderTransform
Definition: Camera.cs:98