• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2017 Google Inc. All Rights Reserved.
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 #ifndef C_ARCORE_HELLOE_AR_UTIL_H_
18 #define C_ARCORE_HELLOE_AR_UTIL_H_
19 
20 #include "include/core/SkMatrix44.h"
21 #include <GLES2/gl2.h>
22 #include <GLES2/gl2ext.h>
23 #include <android/asset_manager.h>
24 #include <android/log.h>
25 #include <cstdint>
26 #include <cstdlib>
27 #include <errno.h>
28 #include <jni.h>
29 #include <vector>
30 
31 #include "arcore_c_api.h"
32 #include "platform_tools/android/apps/arcore/src/main/cpp/glm.h"
33 
34 #ifndef LOGI
35 #define LOGI(...) \
36   __android_log_print(ANDROID_LOG_INFO, "hello_ar_example_c", __VA_ARGS__)
37 #endif  // LOGI
38 
39 #ifndef LOGE
40 #define LOGE(...) \
41   __android_log_print(ANDROID_LOG_ERROR, "hello_ar_example_c", __VA_ARGS__)
42 #endif  // LOGE
43 
44 #ifndef CHECK
45 #define CHECK(condition)                                                   \
46   if (!(condition)) {                                                      \
47     LOGE("*** CHECK FAILED at %s:%d: %s", __FILE__, __LINE__, #condition); \
48     abort();                                                               \
49   }
50 #endif  // CHECK
51 
52 namespace hello_ar {
53     // Utilities
54     namespace util {
55 
56         // Provides a scoped allocated instance of Anchor.
57         // Can be treated as an ArAnchor*.
58         class ScopedArPose {
59         public:
ScopedArPose(const ArSession * session)60             explicit ScopedArPose(const ArSession *session) {
61                 ArPose_create(session, nullptr, &pose_);
62             }
63 
~ScopedArPose()64             ~ScopedArPose() { ArPose_destroy(pose_); }
65 
GetArPose()66             ArPose *GetArPose() { return pose_; }
67 
68             // Delete copy constructors.
69             ScopedArPose(const ScopedArPose &) = delete;
70 
71             void operator=(const ScopedArPose &) = delete;
72 
73         private:
74             ArPose *pose_;
75         };
76 
77         /* GL Utils */
78         // Check GL error, and abort if an error is encountered.
79         //
80         // @param operation, the name of the GL function call.
81         void CheckGlError(const char *operation);
82 
83         // Create a shader program ID.
84         //
85         // @param vertex_source, the vertex shader source.
86         // @param fragment_source, the fragment shader source.
87         // @return
88         GLuint CreateProgram(const char *vertex_source, const char *fragment_source);
89 
90         // Load png file from assets folder and then assign it to the OpenGL target.
91         // This method must be called from the renderer thread since it will result in
92         // OpenGL calls to assign the image to the texture target.
93         //
94         // @param target, openGL texture target to load the image into.
95         // @param path, path to the file, relative to the assets folder.
96         // @return true if png is loaded correctly, otherwise false.
97         bool LoadPngFromAssetManager(int target, const std::string &path);
98 
99 
100         /* ARCore utils */
101         void GetTransformMatrixFromPose(ArSession *ar_session, const ArPose *ar_pose, glm::mat4 *out_model_mat);
102 
103         // Get the plane's normal from center pose.
104         glm::vec3 GetPlaneNormal(const ArSession *ar_session, const ArPose &plane_pose);
105 
106         // Calculate the normal distance to plane from cameraPose, the given planePose
107         // should have y axis parallel to plane's normal, for example plane's center
108         // pose or hit test pose.
109         float CalculateDistanceToPlane(const ArSession *ar_session, const ArPose &plane_pose, const ArPose &camera_pose);
110 
111         // Outputs the camera rotation using display orientation
112         glm::mat4 GetCameraRotationMatrix(float cameraOutRaw[]);
113 
114         // Computes camera position and orientation (using GetCameraRotationMatrix)
115         void GetCameraInfo(ArSession* arSession, ArFrame* arFrame, glm::vec3& cameraPos, glm::mat4& cameraRotation);
116 
117         /* Matrix conversion */
118         SkMatrix44 GlmMatToSkMat(const glm::mat4 m);
119         glm::mat4 SkMatToGlmMat(const SkMatrix44 m);
120 
121         /* Logging utils */
122         //Row major output
123         void Log4x4Matrix(float raw_matrix[16]);
124 
125         //Column major output
126         void LogGlmMat(glm::mat4 m, char *type);
127         void LogSkMat44(SkMatrix44 m, char *type);
128         void LogSkMat(SkMatrix m, char *type);
129         void LogOrientation(float rotationDirection, float angleRad, char *type);
130 
131         /* Vector ops */
132         float Dot(glm::vec3 u, glm::vec3 v);
133         float Magnitude(glm::vec3 u);
134         float AngleRad(glm::vec3 u, glm::vec3 v);
135         glm::vec3 ProjectOntoPlane(glm::vec3 in, glm::vec3 normal);
136     }  // namespace util
137 }  // namespace hello_ar
138 
139 #endif  // C_ARCORE_HELLOE_AR_UTIL_H_
140