1 /*
2  * Copyright (C) 2022 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.app.wallpapereffectsgeneration;
18 
19 import android.annotation.FloatRange;
20 import android.annotation.NonNull;
21 import android.annotation.Size;
22 import android.annotation.SystemApi;
23 import android.os.Parcel;
24 import android.os.Parcelable;
25 
26 /**
27  * Representing the position and other parameters of camera of a single frame.
28  *
29  * @hide
30  */
31 @SystemApi
32 public final class CameraAttributes implements Parcelable {
33     /**
34      * The location of the anchor within the 3D scene.
35      * Expecting 3 floats representing the x, y, z coordinates
36      * of the anchor point.
37      */
38     @NonNull
39     private float[] mAnchorPointInWorldSpace;
40     /**
41      * Where the anchor point should project to in the output image.
42      * Expecting 2 floats representing the u,v coordinates of the
43      * anchor point.
44      */
45     @NonNull
46     private float[] mAnchorPointInOutputUvSpace;
47     /**
48      * Specifies the amount of yaw orbit rotation the camera should perform
49      * around the anchor point in world space.
50      */
51     private float mCameraOrbitYawDegrees;
52     /**
53      * Specifies the amount of pitch orbit rotation the camera should perform
54      * around the anchor point in world space.
55      */
56     private float mCameraOrbitPitchDegrees;
57     /**
58      * Specifies by how much the camera should be placed towards the anchor
59      * point in world space, which is also called dolly distance.
60      */
61     private float mDollyDistanceInWorldSpace;
62     /**
63      * Specifies the vertical fov degrees of the virtual image.
64      */
65     private float mVerticalFovDegrees;
66     /**
67      * The frustum of near plane.
68      */
69     private float mFrustumNearInWorldSpace;
70     /**
71      * The frustum of far plane.
72      */
73     private float mFrustumFarInWorldSpace;
74 
CameraAttributes(Parcel in)75     private CameraAttributes(Parcel in) {
76         this.mCameraOrbitYawDegrees = in.readFloat();
77         this.mCameraOrbitPitchDegrees = in.readFloat();
78         this.mDollyDistanceInWorldSpace = in.readFloat();
79         this.mVerticalFovDegrees = in.readFloat();
80         this.mFrustumNearInWorldSpace = in.readFloat();
81         this.mFrustumFarInWorldSpace = in.readFloat();
82         this.mAnchorPointInWorldSpace = in.createFloatArray();
83         this.mAnchorPointInOutputUvSpace = in.createFloatArray();
84     }
85 
CameraAttributes(float[] anchorPointInWorldSpace, float[] anchorPointInOutputUvSpace, float cameraOrbitYawDegrees, float cameraOrbitPitchDegrees, float dollyDistanceInWorldSpace, float verticalFovDegrees, float frustumNearInWorldSpace, float frustumFarInWorldSpace)86     private CameraAttributes(float[] anchorPointInWorldSpace, float[] anchorPointInOutputUvSpace,
87             float cameraOrbitYawDegrees, float cameraOrbitPitchDegrees,
88             float dollyDistanceInWorldSpace,
89             float verticalFovDegrees, float frustumNearInWorldSpace, float frustumFarInWorldSpace) {
90         mAnchorPointInWorldSpace = anchorPointInWorldSpace;
91         mAnchorPointInOutputUvSpace = anchorPointInOutputUvSpace;
92         mCameraOrbitYawDegrees = cameraOrbitYawDegrees;
93         mCameraOrbitPitchDegrees = cameraOrbitPitchDegrees;
94         mDollyDistanceInWorldSpace = dollyDistanceInWorldSpace;
95         mVerticalFovDegrees = verticalFovDegrees;
96         mFrustumNearInWorldSpace = frustumNearInWorldSpace;
97         mFrustumFarInWorldSpace = frustumFarInWorldSpace;
98     }
99 
100     /**
101      * Get the location of the anchor within the 3D scene. The response float array contains
102      * 3 floats representing the x, y, z coordinates
103      */
104     @NonNull
getAnchorPointInWorldSpace()105     public float[] getAnchorPointInWorldSpace() {
106         return mAnchorPointInWorldSpace;
107     }
108 
109     /**
110      * Get where the anchor point should project to in the output image. The response float
111      * array contains 2 floats representing the u,v coordinates of the anchor point.
112      */
113     @NonNull
getAnchorPointInOutputUvSpace()114     public float[] getAnchorPointInOutputUvSpace() {
115         return mAnchorPointInOutputUvSpace;
116     }
117 
118     /**
119      * Get the camera yaw orbit rotation.
120      */
121     @FloatRange(from = -180.0f, to = 180.0f)
getCameraOrbitYawDegrees()122     public float getCameraOrbitYawDegrees() {
123         return mCameraOrbitYawDegrees;
124     }
125 
126     /**
127      * Get the camera pitch orbit rotation.
128      */
129     @FloatRange(from = -90.0f, to = 90.0f)
getCameraOrbitPitchDegrees()130     public float getCameraOrbitPitchDegrees() {
131         return mCameraOrbitPitchDegrees;
132     }
133 
134     /**
135      * Get how many units the camera should be placed towards the anchor point in world space.
136      */
getDollyDistanceInWorldSpace()137     public float getDollyDistanceInWorldSpace() {
138         return mDollyDistanceInWorldSpace;
139     }
140 
141     /**
142      * Get the camera vertical fov degrees.
143      */
144     @FloatRange(from = 0.0f, to = 180.0f, fromInclusive = false)
getVerticalFovDegrees()145     public float getVerticalFovDegrees() {
146         return mVerticalFovDegrees;
147     }
148 
149     /**
150      * Get the frustum in near plane.
151      */
152     @FloatRange(from = 0.0f)
getFrustumNearInWorldSpace()153     public float getFrustumNearInWorldSpace() {
154         return mFrustumNearInWorldSpace;
155     }
156 
157     /**
158      * Get the frustum in far plane.
159      */
160     @FloatRange(from = 0.0f)
getFrustumFarInWorldSpace()161     public float getFrustumFarInWorldSpace() {
162         return mFrustumFarInWorldSpace;
163     }
164 
165     @NonNull
166     public static final Creator<CameraAttributes> CREATOR = new Creator<CameraAttributes>() {
167         @Override
168         public CameraAttributes createFromParcel(Parcel in) {
169             return new CameraAttributes(in);
170         }
171 
172         @Override
173         public CameraAttributes[] newArray(int size) {
174             return new CameraAttributes[size];
175         }
176     };
177 
178     @Override
writeToParcel(@onNull Parcel out, int flags)179     public void writeToParcel(@NonNull Parcel out, int flags) {
180         out.writeFloat(mCameraOrbitYawDegrees);
181         out.writeFloat(mCameraOrbitPitchDegrees);
182         out.writeFloat(mDollyDistanceInWorldSpace);
183         out.writeFloat(mVerticalFovDegrees);
184         out.writeFloat(mFrustumNearInWorldSpace);
185         out.writeFloat(mFrustumFarInWorldSpace);
186         out.writeFloatArray(mAnchorPointInWorldSpace);
187         out.writeFloatArray(mAnchorPointInOutputUvSpace);
188     }
189 
190     @Override
describeContents()191     public int describeContents() {
192         return 0;
193     }
194 
195     /**
196      * Builder for {@link CameraAttributes}.
197      *
198      * @hide
199      */
200     @SystemApi
201     public static final class Builder {
202         @NonNull
203         private float[] mAnchorPointInWorldSpace;
204         @NonNull
205         private float[] mAnchorPointInOutputUvSpace;
206         private float mCameraOrbitYawDegrees;
207         private float mCameraOrbitPitchDegrees;
208         private float mDollyDistanceInWorldSpace;
209         private float mVerticalFovDegrees;
210         private float mFrustumNearInWorldSpace;
211         private float mFrustumFarInWorldSpace;
212 
213         /**
214          * Constructor with anchor point in world space and anchor point in output image
215          * space.
216          *
217          * @param anchorPointInWorldSpace the location of the anchor within the 3D scene. The
218          *  float array contains 3 floats representing the x, y, z coordinates.
219          * @param anchorPointInOutputUvSpace where the anchor point should project to in the
220          *  output image. The  float array contains 2 floats representing the u,v coordinates
221          *  of the anchor point.
222          *
223          * @hide
224          */
225         @SystemApi
Builder(@onNull @ize3) float[] anchorPointInWorldSpace, @NonNull @Size(2) float[] anchorPointInOutputUvSpace)226         public Builder(@NonNull @Size(3) float[] anchorPointInWorldSpace,
227                 @NonNull @Size(2) float[] anchorPointInOutputUvSpace) {
228             mAnchorPointInWorldSpace = anchorPointInWorldSpace;
229             mAnchorPointInOutputUvSpace = anchorPointInOutputUvSpace;
230         }
231 
232         /**
233          * Sets the camera orbit yaw rotation.
234          */
235         @NonNull
setCameraOrbitYawDegrees( @loatRangefrom = -180.0f, to = 180.0f) float cameraOrbitYawDegrees)236         public Builder setCameraOrbitYawDegrees(
237                 @FloatRange(from = -180.0f, to = 180.0f) float cameraOrbitYawDegrees) {
238             mCameraOrbitYawDegrees = cameraOrbitYawDegrees;
239             return this;
240         }
241 
242         /**
243          * Sets the camera orbit pitch rotation.
244          */
245         @NonNull
setCameraOrbitPitchDegrees( @loatRangefrom = -90.0f, to = 90.0f) float cameraOrbitPitchDegrees)246         public Builder setCameraOrbitPitchDegrees(
247                 @FloatRange(from = -90.0f, to = 90.0f) float cameraOrbitPitchDegrees) {
248             mCameraOrbitPitchDegrees = cameraOrbitPitchDegrees;
249             return this;
250         }
251 
252         /**
253          * Sets the camera dolly distance.
254          */
255         @NonNull
setDollyDistanceInWorldSpace(float dollyDistanceInWorldSpace)256         public Builder setDollyDistanceInWorldSpace(float dollyDistanceInWorldSpace) {
257             mDollyDistanceInWorldSpace = dollyDistanceInWorldSpace;
258             return this;
259         }
260 
261         /**
262          * Sets the camera vertical fov degree.
263          */
264         @NonNull
setVerticalFovDegrees( @loatRangefrom = 0.0f, to = 180.0f, fromInclusive = false) float verticalFovDegrees)265         public Builder setVerticalFovDegrees(
266                 @FloatRange(from = 0.0f, to = 180.0f, fromInclusive = false)
267                         float verticalFovDegrees) {
268             mVerticalFovDegrees = verticalFovDegrees;
269             return this;
270         }
271 
272         /**
273          * Sets the frustum in near plane.
274          */
275         @NonNull
setFrustumNearInWorldSpace( @loatRangefrom = 0.0f) float frustumNearInWorldSpace)276         public Builder setFrustumNearInWorldSpace(
277                 @FloatRange(from = 0.0f) float frustumNearInWorldSpace) {
278             mFrustumNearInWorldSpace = frustumNearInWorldSpace;
279             return this;
280         }
281 
282         /**
283          * Sets the frustum in far plane.
284          */
285         @NonNull
setFrustumFarInWorldSpace( @loatRangefrom = 0.0f) float frustumFarInWorldSpace)286         public Builder setFrustumFarInWorldSpace(
287                 @FloatRange(from = 0.0f) float frustumFarInWorldSpace) {
288             mFrustumFarInWorldSpace = frustumFarInWorldSpace;
289             return this;
290         }
291 
292         /**
293          * Builds a new {@link CameraAttributes} instance.
294          */
295         @NonNull
build()296         public CameraAttributes build() {
297             return new CameraAttributes(mAnchorPointInWorldSpace,
298                     mAnchorPointInOutputUvSpace,
299                     mCameraOrbitYawDegrees,
300                     mCameraOrbitPitchDegrees,
301                     mDollyDistanceInWorldSpace,
302                     mVerticalFovDegrees,
303                     mFrustumNearInWorldSpace,
304                     mFrustumFarInWorldSpace);
305         }
306     }
307 }
308