Modules: update modules to be built for iOS
Using 'available' checks to fix deprecation compilation errors Additional checks for simulator
This commit is contained in:
@ -60,8 +60,8 @@ private:
|
|||||||
float eye_height, z_near, z_far;
|
float eye_height, z_near, z_far;
|
||||||
|
|
||||||
Ref<CameraFeed> feed;
|
Ref<CameraFeed> feed;
|
||||||
int image_width[2];
|
size_t image_width[2];
|
||||||
int image_height[2];
|
size_t image_height[2];
|
||||||
Vector<uint8_t> img_data[2];
|
Vector<uint8_t> img_data[2];
|
||||||
|
|
||||||
struct anchor_map {
|
struct anchor_map {
|
||||||
@ -84,9 +84,9 @@ public:
|
|||||||
void start_session();
|
void start_session();
|
||||||
void stop_session();
|
void stop_session();
|
||||||
|
|
||||||
bool get_anchor_detection_is_enabled() const;
|
bool get_anchor_detection_is_enabled() const override;
|
||||||
void set_anchor_detection_is_enabled(bool p_enable);
|
void set_anchor_detection_is_enabled(bool p_enable) override;
|
||||||
virtual int get_camera_feed_id();
|
virtual int get_camera_feed_id() override;
|
||||||
|
|
||||||
bool get_light_estimation_is_enabled() const;
|
bool get_light_estimation_is_enabled() const;
|
||||||
void set_light_estimation_is_enabled(bool p_enable);
|
void set_light_estimation_is_enabled(bool p_enable);
|
||||||
@ -97,22 +97,22 @@ public:
|
|||||||
/* while Godot has its own raycast logic this takes ARKits camera into account and hits on any ARAnchor */
|
/* while Godot has its own raycast logic this takes ARKits camera into account and hits on any ARAnchor */
|
||||||
Array raycast(Vector2 p_screen_coord);
|
Array raycast(Vector2 p_screen_coord);
|
||||||
|
|
||||||
void notification(int p_what);
|
virtual void notification(int p_what) override;
|
||||||
|
|
||||||
virtual StringName get_name() const;
|
virtual StringName get_name() const override;
|
||||||
virtual int get_capabilities() const;
|
virtual int get_capabilities() const override;
|
||||||
|
|
||||||
virtual bool is_initialized() const;
|
virtual bool is_initialized() const override;
|
||||||
virtual bool initialize();
|
virtual bool initialize() override;
|
||||||
virtual void uninitialize();
|
virtual void uninitialize() override;
|
||||||
|
|
||||||
virtual Size2 get_render_targetsize();
|
virtual Size2 get_render_targetsize() override;
|
||||||
virtual bool is_stereo();
|
virtual bool is_stereo() override;
|
||||||
virtual Transform get_transform_for_eye(XRInterface::Eyes p_eye, const Transform &p_cam_transform);
|
virtual Transform get_transform_for_eye(XRInterface::Eyes p_eye, const Transform &p_cam_transform) override;
|
||||||
virtual CameraMatrix get_projection_for_eye(XRInterface::Eyes p_eye, real_t p_aspect, real_t p_z_near, real_t p_z_far);
|
virtual CameraMatrix get_projection_for_eye(XRInterface::Eyes p_eye, real_t p_aspect, real_t p_z_near, real_t p_z_far) override;
|
||||||
virtual void commit_for_eye(XRInterface::Eyes p_eye, RID p_render_target, const Rect2 &p_screen_rect);
|
virtual void commit_for_eye(XRInterface::Eyes p_eye, RID p_render_target, const Rect2 &p_screen_rect) override;
|
||||||
|
|
||||||
virtual void process();
|
virtual void process() override;
|
||||||
|
|
||||||
// called by delegate (void * because C++ and Obj-C don't always mix, should really change all platform/iphone/*.cpp files to .mm)
|
// called by delegate (void * because C++ and Obj-C don't always mix, should really change all platform/iphone/*.cpp files to .mm)
|
||||||
void _add_or_update_anchor(void *p_anchor);
|
void _add_or_update_anchor(void *p_anchor);
|
||||||
|
|||||||
@ -42,7 +42,9 @@
|
|||||||
#include "arkit_session_delegate.h"
|
#include "arkit_session_delegate.h"
|
||||||
|
|
||||||
// just a dirty workaround for now, declare these as globals. I'll probably encapsulate ARSession and associated logic into an mm object and change ARKitInterface to a normal cpp object that consumes it.
|
// just a dirty workaround for now, declare these as globals. I'll probably encapsulate ARSession and associated logic into an mm object and change ARKitInterface to a normal cpp object that consumes it.
|
||||||
|
API_AVAILABLE(ios(11.0))
|
||||||
ARSession *ar_session;
|
ARSession *ar_session;
|
||||||
|
|
||||||
ARKitSessionDelegate *ar_delegate;
|
ARKitSessionDelegate *ar_delegate;
|
||||||
NSTimeInterval last_timestamp;
|
NSTimeInterval last_timestamp;
|
||||||
|
|
||||||
@ -55,12 +57,17 @@ void ARKitInterface::start_session() {
|
|||||||
if (initialized) {
|
if (initialized) {
|
||||||
print_line("Starting ARKit session");
|
print_line("Starting ARKit session");
|
||||||
|
|
||||||
|
if (@available(iOS 11, *)) {
|
||||||
Class ARWorldTrackingConfigurationClass = NSClassFromString(@"ARWorldTrackingConfiguration");
|
Class ARWorldTrackingConfigurationClass = NSClassFromString(@"ARWorldTrackingConfiguration");
|
||||||
ARWorldTrackingConfiguration *configuration = [ARWorldTrackingConfigurationClass new];
|
ARWorldTrackingConfiguration *configuration = [ARWorldTrackingConfigurationClass new];
|
||||||
|
|
||||||
configuration.lightEstimationEnabled = light_estimation_is_enabled;
|
configuration.lightEstimationEnabled = light_estimation_is_enabled;
|
||||||
if (plane_detection_is_enabled) {
|
if (plane_detection_is_enabled) {
|
||||||
|
if (@available(iOS 11.3, *)) {
|
||||||
configuration.planeDetection = ARPlaneDetectionVertical | ARPlaneDetectionHorizontal;
|
configuration.planeDetection = ARPlaneDetectionVertical | ARPlaneDetectionHorizontal;
|
||||||
|
} else {
|
||||||
|
configuration.planeDetection = ARPlaneDetectionHorizontal;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
configuration.planeDetection = 0;
|
configuration.planeDetection = 0;
|
||||||
}
|
}
|
||||||
@ -73,6 +80,7 @@ void ARKitInterface::start_session() {
|
|||||||
[ar_session runWithConfiguration:configuration];
|
[ar_session runWithConfiguration:configuration];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ARKitInterface::stop_session() {
|
void ARKitInterface::stop_session() {
|
||||||
session_was_started = false;
|
session_was_started = false;
|
||||||
@ -84,20 +92,22 @@ void ARKitInterface::stop_session() {
|
|||||||
feed->set_active(false);
|
feed->set_active(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (@available(iOS 11.0, *)) {
|
||||||
[ar_session pause];
|
[ar_session pause];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ARKitInterface::notification(int p_what) {
|
void ARKitInterface::notification(int p_what) {
|
||||||
// TODO, this is not being called, need to find out why, possibly because this is not a node.
|
// TODO, this is not being called, need to find out why, possibly because this is not a node.
|
||||||
// in that case we need to find a way to get these notifications!
|
// in that case we need to find a way to get these notifications!
|
||||||
switch (p_what) {
|
switch (p_what) {
|
||||||
case MainLoop::NOTIFICATION_WM_FOCUS_IN: {
|
case DisplayServer::WINDOW_EVENT_FOCUS_IN: {
|
||||||
print_line("Focus in");
|
print_line("Focus in");
|
||||||
|
|
||||||
start_session();
|
start_session();
|
||||||
}; break;
|
}; break;
|
||||||
case MainLoop::NOTIFICATION_WM_FOCUS_OUT: {
|
case DisplayServer::WINDOW_EVENT_FOCUS_OUT: {
|
||||||
print_line("Focus out");
|
print_line("Focus out");
|
||||||
|
|
||||||
stop_session();
|
stop_session();
|
||||||
@ -162,14 +172,16 @@ int ARKitInterface::get_capabilities() const {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Array ARKitInterface::raycast(Vector2 p_screen_coord) {
|
Array ARKitInterface::raycast(Vector2 p_screen_coord) {
|
||||||
|
if (@available(iOS 11, *)) {
|
||||||
Array arr;
|
Array arr;
|
||||||
Size2 screen_size = OS::get_singleton()->get_window_size();
|
Size2 screen_size = DisplayServer::get_singleton()->screen_get_size();
|
||||||
CGPoint point;
|
CGPoint point;
|
||||||
point.x = p_screen_coord.x / screen_size.x;
|
point.x = p_screen_coord.x / screen_size.x;
|
||||||
point.y = p_screen_coord.y / screen_size.y;
|
point.y = p_screen_coord.y / screen_size.y;
|
||||||
|
|
||||||
///@TODO maybe give more options here, for now we're taking just ARAchors into account that were found during plane detection keeping their size into account
|
///@TODO maybe give more options here, for now we're taking just ARAchors into account that were found during plane detection keeping their size into account
|
||||||
NSArray<ARHitTestResult *> *results = [ar_session.currentFrame hittest:point types:ARHitTestResultTypeExistingPlaneUsingExtent];
|
|
||||||
|
NSArray<ARHitTestResult *> *results = [ar_session.currentFrame hitTest:point types:ARHitTestResultTypeExistingPlaneUsingExtent];
|
||||||
|
|
||||||
for (ARHitTestResult *result in results) {
|
for (ARHitTestResult *result in results) {
|
||||||
Transform transform;
|
Transform transform;
|
||||||
@ -193,6 +205,9 @@ Array ARKitInterface::raycast(Vector2 p_screen_coord) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return arr;
|
return arr;
|
||||||
|
} else {
|
||||||
|
return Array();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ARKitInterface::_bind_methods() {
|
void ARKitInterface::_bind_methods() {
|
||||||
@ -221,6 +236,7 @@ bool ARKitInterface::initialize() {
|
|||||||
XRServer *xr_server = XRServer::get_singleton();
|
XRServer *xr_server = XRServer::get_singleton();
|
||||||
ERR_FAIL_NULL_V(xr_server, false);
|
ERR_FAIL_NULL_V(xr_server, false);
|
||||||
|
|
||||||
|
if (@available(iOS 11, *)) {
|
||||||
if (!initialized) {
|
if (!initialized) {
|
||||||
print_line("initializing ARKit");
|
print_line("initializing ARKit");
|
||||||
|
|
||||||
@ -266,6 +282,9 @@ bool ARKitInterface::initialize() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ARKitInterface::uninitialize() {
|
void ARKitInterface::uninitialize() {
|
||||||
@ -286,9 +305,12 @@ void ARKitInterface::uninitialize() {
|
|||||||
|
|
||||||
remove_all_anchors();
|
remove_all_anchors();
|
||||||
|
|
||||||
|
if (@available(iOS 11.0, *)) {
|
||||||
[ar_session release];
|
[ar_session release];
|
||||||
[ar_delegate release];
|
|
||||||
ar_session = NULL;
|
ar_session = NULL;
|
||||||
|
}
|
||||||
|
[ar_delegate release];
|
||||||
|
|
||||||
ar_delegate = NULL;
|
ar_delegate = NULL;
|
||||||
initialized = false;
|
initialized = false;
|
||||||
session_was_started = false;
|
session_was_started = false;
|
||||||
@ -296,15 +318,15 @@ void ARKitInterface::uninitialize() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Size2 ARKitInterface::get_render_targetsize() {
|
Size2 ARKitInterface::get_render_targetsize() {
|
||||||
_THREAD_SAFE_METHOD_
|
// _THREAD_SAFE_METHOD_
|
||||||
|
|
||||||
Size2 target_size = OS::get_singleton()->get_window_size();
|
Size2 target_size = DisplayServer::get_singleton()->screen_get_size();
|
||||||
|
|
||||||
return target_size;
|
return target_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
Transform ARKitInterface::get_transform_for_eye(XRInterface::Eyes p_eye, const Transform &p_cam_transform) {
|
Transform ARKitInterface::get_transform_for_eye(XRInterface::Eyes p_eye, const Transform &p_cam_transform) {
|
||||||
_THREAD_SAFE_METHOD_
|
// _THREAD_SAFE_METHOD_
|
||||||
|
|
||||||
Transform transform_for_eye;
|
Transform transform_for_eye;
|
||||||
|
|
||||||
@ -336,7 +358,7 @@ CameraMatrix ARKitInterface::get_projection_for_eye(XRInterface::Eyes p_eye, rea
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ARKitInterface::commit_for_eye(XRInterface::Eyes p_eye, RID p_render_target, const Rect2 &p_screen_rect) {
|
void ARKitInterface::commit_for_eye(XRInterface::Eyes p_eye, RID p_render_target, const Rect2 &p_screen_rect) {
|
||||||
_THREAD_SAFE_METHOD_
|
// _THREAD_SAFE_METHOD_
|
||||||
|
|
||||||
// We must have a valid render target
|
// We must have a valid render target
|
||||||
ERR_FAIL_COND(!p_render_target.is_valid());
|
ERR_FAIL_COND(!p_render_target.is_valid());
|
||||||
@ -345,15 +367,15 @@ void ARKitInterface::commit_for_eye(XRInterface::Eyes p_eye, RID p_render_target
|
|||||||
ERR_FAIL_COND(p_screen_rect == Rect2());
|
ERR_FAIL_COND(p_screen_rect == Rect2());
|
||||||
|
|
||||||
// get the size of our screen
|
// get the size of our screen
|
||||||
Rect2 screen_rect = p_screen_rect;
|
// Rect2 screen_rect = p_screen_rect;
|
||||||
|
|
||||||
// screen_rect.position.x += screen_rect.size.x;
|
// screen_rect.position.x += screen_rect.size.x;
|
||||||
// screen_rect.size.x = -screen_rect.size.x;
|
// screen_rect.size.x = -screen_rect.size.x;
|
||||||
// screen_rect.position.y += screen_rect.size.y;
|
// screen_rect.position.y += screen_rect.size.y;
|
||||||
// screen_rect.size.y = -screen_rect.size.y;
|
// screen_rect.size.y = -screen_rect.size.y;
|
||||||
|
|
||||||
VSG::rasterizer->set_current_render_target(RID());
|
// VSG::rasterizer->set_current_render_target(RID());
|
||||||
VSG::rasterizer->blit_render_target_to_screen(p_render_target, screen_rect, 0);
|
// VSG::rasterizer->blit_render_target_to_screen(p_render_target, screen_rect, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
XRPositionalTracker *ARKitInterface::get_anchor_for_uuid(const unsigned char *p_uuid) {
|
XRPositionalTracker *ARKitInterface::get_anchor_for_uuid(const unsigned char *p_uuid) {
|
||||||
@ -432,7 +454,7 @@ void ARKitInterface::remove_all_anchors() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ARKitInterface::process() {
|
void ARKitInterface::process() {
|
||||||
_THREAD_SAFE_METHOD_
|
// _THREAD_SAFE_METHOD_
|
||||||
|
|
||||||
if (@available(iOS 11.0, *)) {
|
if (@available(iOS 11.0, *)) {
|
||||||
if (initialized) {
|
if (initialized) {
|
||||||
@ -443,8 +465,16 @@ void ARKitInterface::process() {
|
|||||||
last_timestamp = current_frame.timestamp;
|
last_timestamp = current_frame.timestamp;
|
||||||
|
|
||||||
// get some info about our screen and orientation
|
// get some info about our screen and orientation
|
||||||
Size2 screen_size = OS::get_singleton()->get_window_size();
|
Size2 screen_size = DisplayServer::get_singleton()->screen_get_size();
|
||||||
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
|
UIInterfaceOrientation orientation = UIInterfaceOrientationUnknown;
|
||||||
|
|
||||||
|
if (@available(iOS 13, *)) {
|
||||||
|
orientation = [UIApplication sharedApplication].delegate.window.windowScene.interfaceOrientation;
|
||||||
|
#if !defined(TARGET_OS_SIMULATOR) || !TARGET_OS_SIMULATOR
|
||||||
|
} else {
|
||||||
|
orientation = [[UIApplication sharedApplication] statusBarOrientation];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
// Grab our camera image for our backbuffer
|
// Grab our camera image for our backbuffer
|
||||||
CVPixelBufferRef pixelBuffer = current_frame.capturedImage;
|
CVPixelBufferRef pixelBuffer = current_frame.capturedImage;
|
||||||
@ -475,27 +505,27 @@ void ARKitInterface::process() {
|
|||||||
|
|
||||||
{
|
{
|
||||||
// do Y
|
// do Y
|
||||||
int new_width = CVPixelBufferGetWidthOfPlane(pixelBuffer, 0);
|
size_t new_width = CVPixelBufferGetWidthOfPlane(pixelBuffer, 0);
|
||||||
int new_height = CVPixelBufferGetHeightOfPlane(pixelBuffer, 0);
|
size_t new_height = CVPixelBufferGetHeightOfPlane(pixelBuffer, 0);
|
||||||
int bytes_per_row = CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 0);
|
size_t bytes_per_row = CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 0);
|
||||||
|
|
||||||
if ((image_width[0] != new_width) || (image_height[0] != new_height)) {
|
if ((image_width[0] != new_width) || (image_height[0] != new_height)) {
|
||||||
printf("- Camera padding l:%lu r:%lu t:%lu b:%lu\n", extraLeft, extraRight, extraTop, extraBottom);
|
printf("- Camera padding l:%lu r:%lu t:%lu b:%lu\n", extraLeft, extraRight, extraTop, extraBottom);
|
||||||
printf("- Camera Y plane size: %i, %i - %i\n", new_width, new_height, bytes_per_row);
|
printf("- Camera Y plane size: %lu, %lu - %lu\n", new_width, new_height, bytes_per_row);
|
||||||
|
|
||||||
image_width[0] = new_width;
|
image_width[0] = new_width;
|
||||||
image_height[0] = new_height;
|
image_height[0] = new_height;
|
||||||
img_data[0].resize(new_width * new_height);
|
img_data[0].resize(new_width * new_height);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t *w = img_data[0].write();
|
uint8_t *w = img_data[0].ptrw();
|
||||||
if (new_width == bytes_per_row) {
|
if (new_width == bytes_per_row) {
|
||||||
memcpy(w.ptr(), dataY, new_width * new_height);
|
memcpy(w, dataY, new_width * new_height);
|
||||||
} else {
|
} else {
|
||||||
int offset_a = 0;
|
size_t offset_a = 0;
|
||||||
int offset_b = extraLeft + (extraTop * bytes_per_row);
|
size_t offset_b = extraLeft + (extraTop * bytes_per_row);
|
||||||
for (int r = 0; r < new_height; r++) {
|
for (size_t r = 0; r < new_height; r++) {
|
||||||
memcpy(w.ptr() + offset_a, dataY + offset_b, new_width);
|
memcpy(w + offset_a, dataY + offset_b, new_width);
|
||||||
offset_a += new_width;
|
offset_a += new_width;
|
||||||
offset_b += bytes_per_row;
|
offset_b += bytes_per_row;
|
||||||
}
|
}
|
||||||
@ -507,26 +537,26 @@ void ARKitInterface::process() {
|
|||||||
|
|
||||||
{
|
{
|
||||||
// do CbCr
|
// do CbCr
|
||||||
int new_width = CVPixelBufferGetWidthOfPlane(pixelBuffer, 1);
|
size_t new_width = CVPixelBufferGetWidthOfPlane(pixelBuffer, 1);
|
||||||
int new_height = CVPixelBufferGetHeightOfPlane(pixelBuffer, 1);
|
size_t new_height = CVPixelBufferGetHeightOfPlane(pixelBuffer, 1);
|
||||||
int bytes_per_row = CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 0);
|
size_t bytes_per_row = CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 0);
|
||||||
|
|
||||||
if ((image_width[1] != new_width) || (image_height[1] != new_height)) {
|
if ((image_width[1] != new_width) || (image_height[1] != new_height)) {
|
||||||
printf("- Camera CbCr plane size: %i, %i - %i\n", new_width, new_height, bytes_per_row);
|
printf("- Camera CbCr plane size: %lu, %lu - %lu\n", new_width, new_height, bytes_per_row);
|
||||||
|
|
||||||
image_width[1] = new_width;
|
image_width[1] = new_width;
|
||||||
image_height[1] = new_height;
|
image_height[1] = new_height;
|
||||||
img_data[1].resize(2 * new_width * new_height);
|
img_data[1].resize(2 * new_width * new_height);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t *w = img_data[1].write();
|
uint8_t *w = img_data[1].ptrw();
|
||||||
if ((2 * new_width) == bytes_per_row) {
|
if ((2 * new_width) == bytes_per_row) {
|
||||||
memcpy(w.ptr(), dataCbCr, 2 * new_width * new_height);
|
memcpy(w, dataCbCr, 2 * new_width * new_height);
|
||||||
} else {
|
} else {
|
||||||
int offset_a = 0;
|
size_t offset_a = 0;
|
||||||
int offset_b = extraLeft + (extraTop * bytes_per_row);
|
size_t offset_b = extraLeft + (extraTop * bytes_per_row);
|
||||||
for (int r = 0; r < new_height; r++) {
|
for (size_t r = 0; r < new_height; r++) {
|
||||||
memcpy(w.ptr() + offset_a, dataCbCr + offset_b, 2 * new_width);
|
memcpy(w + offset_a, dataCbCr + offset_b, 2 * new_width);
|
||||||
offset_a += 2 * new_width;
|
offset_a += 2 * new_width;
|
||||||
offset_b += bytes_per_row;
|
offset_b += bytes_per_row;
|
||||||
}
|
}
|
||||||
@ -658,8 +688,9 @@ void ARKitInterface::process() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ARKitInterface::_add_or_update_anchor(void *p_anchor) {
|
void ARKitInterface::_add_or_update_anchor(void *p_anchor) {
|
||||||
_THREAD_SAFE_METHOD_
|
// _THREAD_SAFE_METHOD_
|
||||||
|
|
||||||
|
if (@available(iOS 11.0, *)) {
|
||||||
ARAnchor *anchor = (ARAnchor *)p_anchor;
|
ARAnchor *anchor = (ARAnchor *)p_anchor;
|
||||||
|
|
||||||
unsigned char uuid[16];
|
unsigned char uuid[16];
|
||||||
@ -673,6 +704,7 @@ void ARKitInterface::_add_or_update_anchor(void *p_anchor) {
|
|||||||
// can we safely cast this?
|
// can we safely cast this?
|
||||||
ARPlaneAnchor *planeAnchor = (ARPlaneAnchor *)anchor;
|
ARPlaneAnchor *planeAnchor = (ARPlaneAnchor *)anchor;
|
||||||
|
|
||||||
|
if (@available(iOS 11.3, *)) {
|
||||||
if (planeAnchor.geometry.triangleCount > 0) {
|
if (planeAnchor.geometry.triangleCount > 0) {
|
||||||
Ref<SurfaceTool> surftool;
|
Ref<SurfaceTool> surftool;
|
||||||
surftool.instance();
|
surftool.instance();
|
||||||
@ -693,6 +725,10 @@ void ARKitInterface::_add_or_update_anchor(void *p_anchor) {
|
|||||||
Ref<Mesh> nomesh;
|
Ref<Mesh> nomesh;
|
||||||
tracker->set_mesh(nomesh);
|
tracker->set_mesh(nomesh);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
Ref<Mesh> nomesh;
|
||||||
|
tracker->set_mesh(nomesh);
|
||||||
|
}
|
||||||
|
|
||||||
// Note, this also contains a scale factor which gives us an idea of the size of the anchor
|
// Note, this also contains a scale factor which gives us an idea of the size of the anchor
|
||||||
// We may extract that in our XRAnchor class
|
// We may extract that in our XRAnchor class
|
||||||
@ -711,10 +747,12 @@ void ARKitInterface::_add_or_update_anchor(void *p_anchor) {
|
|||||||
tracker->set_rw_position(Vector3(m44.columns[3][0], m44.columns[3][1], m44.columns[3][2]));
|
tracker->set_rw_position(Vector3(m44.columns[3][0], m44.columns[3][1], m44.columns[3][2]));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ARKitInterface::_remove_anchor(void *p_anchor) {
|
void ARKitInterface::_remove_anchor(void *p_anchor) {
|
||||||
_THREAD_SAFE_METHOD_
|
// _THREAD_SAFE_METHOD_
|
||||||
|
|
||||||
|
if (@available(iOS 11.0, *)) {
|
||||||
ARAnchor *anchor = (ARAnchor *)p_anchor;
|
ARAnchor *anchor = (ARAnchor *)p_anchor;
|
||||||
|
|
||||||
unsigned char uuid[16];
|
unsigned char uuid[16];
|
||||||
@ -722,13 +760,16 @@ void ARKitInterface::_remove_anchor(void *p_anchor) {
|
|||||||
|
|
||||||
remove_anchor_for_uuid(uuid);
|
remove_anchor_for_uuid(uuid);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ARKitInterface::ARKitInterface() {
|
ARKitInterface::ARKitInterface() {
|
||||||
initialized = false;
|
initialized = false;
|
||||||
session_was_started = false;
|
session_was_started = false;
|
||||||
plane_detection_is_enabled = false;
|
plane_detection_is_enabled = false;
|
||||||
light_estimation_is_enabled = false;
|
light_estimation_is_enabled = false;
|
||||||
|
if (@available(iOS 11.0, *)) {
|
||||||
ar_session = NULL;
|
ar_session = NULL;
|
||||||
|
}
|
||||||
z_near = 0.01;
|
z_near = 0.01;
|
||||||
z_far = 1000.0;
|
z_far = 1000.0;
|
||||||
projection.set_perspective(60.0, 1.0, z_near, z_far, false);
|
projection.set_perspective(60.0, 1.0, z_near, z_far, false);
|
||||||
|
|||||||
@ -42,9 +42,9 @@ class ARKitInterface;
|
|||||||
|
|
||||||
@property(nonatomic) ARKitInterface *arkit_interface;
|
@property(nonatomic) ARKitInterface *arkit_interface;
|
||||||
|
|
||||||
- (void)session:(ARSession *)session didAddAnchors:(NSArray<ARAnchor *> *)anchors;
|
- (void)session:(ARSession *)session didAddAnchors:(NSArray<ARAnchor *> *)anchors API_AVAILABLE(ios(11.0));
|
||||||
- (void)session:(ARSession *)session didRemoveAnchors:(NSArray<ARAnchor *> *)anchors;
|
- (void)session:(ARSession *)session didRemoveAnchors:(NSArray<ARAnchor *> *)anchors API_AVAILABLE(ios(11.0));
|
||||||
- (void)session:(ARSession *)session didUpdateAnchors:(NSArray<ARAnchor *> *)anchors;
|
- (void)session:(ARSession *)session didUpdateAnchors:(NSArray<ARAnchor *> *)anchors API_AVAILABLE(ios(11.0));
|
||||||
@end
|
@end
|
||||||
|
|
||||||
#endif /* !ARKIT_SESSION_DELEGATE_H */
|
#endif /* !ARKIT_SESSION_DELEGATE_H */
|
||||||
|
|||||||
@ -158,25 +158,31 @@
|
|||||||
} else if (dataCbCr == NULL) {
|
} else if (dataCbCr == NULL) {
|
||||||
print_line("Couldn't access CbCr pixel buffer data");
|
print_line("Couldn't access CbCr pixel buffer data");
|
||||||
} else {
|
} else {
|
||||||
UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
|
UIInterfaceOrientation orientation = UIInterfaceOrientationUnknown;
|
||||||
|
|
||||||
|
if (@available(iOS 13, *)) {
|
||||||
|
orientation = [UIApplication sharedApplication].delegate.window.windowScene.interfaceOrientation;
|
||||||
|
#if !defined(TARGET_OS_SIMULATOR) || !TARGET_OS_SIMULATOR
|
||||||
|
} else {
|
||||||
|
orientation = [[UIApplication sharedApplication] statusBarOrientation];
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
Ref<Image> img[2];
|
Ref<Image> img[2];
|
||||||
|
|
||||||
{
|
{
|
||||||
// do Y
|
// do Y
|
||||||
int new_width = CVPixelBufferGetWidthOfPlane(pixelBuffer, 0);
|
size_t new_width = CVPixelBufferGetWidthOfPlane(pixelBuffer, 0);
|
||||||
int new_height = CVPixelBufferGetHeightOfPlane(pixelBuffer, 0);
|
size_t new_height = CVPixelBufferGetHeightOfPlane(pixelBuffer, 0);
|
||||||
int _bytes_per_row = CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 0);
|
|
||||||
|
|
||||||
if ((width[0] != new_width) || (height[0] != new_height)) {
|
if ((width[0] != new_width) || (height[0] != new_height)) {
|
||||||
// printf("Camera Y plane %i, %i - %i\n", new_width, new_height, bytes_per_row);
|
|
||||||
|
|
||||||
width[0] = new_width;
|
width[0] = new_width;
|
||||||
height[0] = new_height;
|
height[0] = new_height;
|
||||||
img_data[0].resize(new_width * new_height);
|
img_data[0].resize(new_width * new_height);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t *w = img_data[0].ptrw();
|
uint8_t *w = img_data[0].ptrw();
|
||||||
memcpy(w.ptr(), dataY, new_width * new_height);
|
memcpy(w, dataY, new_width * new_height);
|
||||||
|
|
||||||
img[0].instance();
|
img[0].instance();
|
||||||
img[0]->create(new_width, new_height, 0, Image::FORMAT_R8, img_data[0]);
|
img[0]->create(new_width, new_height, 0, Image::FORMAT_R8, img_data[0]);
|
||||||
@ -184,20 +190,17 @@
|
|||||||
|
|
||||||
{
|
{
|
||||||
// do CbCr
|
// do CbCr
|
||||||
int new_width = CVPixelBufferGetWidthOfPlane(pixelBuffer, 1);
|
size_t new_width = CVPixelBufferGetWidthOfPlane(pixelBuffer, 1);
|
||||||
int new_height = CVPixelBufferGetHeightOfPlane(pixelBuffer, 1);
|
size_t new_height = CVPixelBufferGetHeightOfPlane(pixelBuffer, 1);
|
||||||
int bytes_per_row = CVPixelBufferGetBytesPerRowOfPlane(pixelBuffer, 1);
|
|
||||||
|
|
||||||
if ((width[1] != new_width) || (height[1] != new_height)) {
|
if ((width[1] != new_width) || (height[1] != new_height)) {
|
||||||
// printf("Camera CbCr plane %i, %i - %i\n", new_width, new_height, bytes_per_row);
|
|
||||||
|
|
||||||
width[1] = new_width;
|
width[1] = new_width;
|
||||||
height[1] = new_height;
|
height[1] = new_height;
|
||||||
img_data[1].resize(2 * new_width * new_height);
|
img_data[1].resize(2 * new_width * new_height);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t *w = img_data[1].ptrw();
|
uint8_t *w = img_data[1].ptrw();
|
||||||
memcpy(w.ptr(), dataCbCr, 2 * new_width * new_height);
|
memcpy(w, dataCbCr, 2 * new_width * new_height);
|
||||||
|
|
||||||
///TODO GLES2 doesn't support FORMAT_RG8, need to do some form of conversion
|
///TODO GLES2 doesn't support FORMAT_RG8, need to do some form of conversion
|
||||||
img[1].instance();
|
img[1].instance();
|
||||||
@ -359,7 +362,24 @@ void CameraIOS::update_feeds() {
|
|||||||
// this way of doing things is deprecated but still works,
|
// this way of doing things is deprecated but still works,
|
||||||
// rewrite to using AVCaptureDeviceDiscoverySession
|
// rewrite to using AVCaptureDeviceDiscoverySession
|
||||||
|
|
||||||
AVCaptureDeviceDiscoverySession *session = [AVCaptureDeviceDiscoverySession discoverySessionWithDeviceTypes:[NSArray arrayWithObjects:AVCaptureDeviceTypeBuiltInTelephotoCamera, AVCaptureDeviceTypeBuiltInDualCamera, AVCaptureDeviceTypeBuiltInTrueDepthCamera, AVCaptureDeviceTypeBuiltInWideAngleCamera, nil] mediaType:AVMediaTypeVideo position:AVCaptureDevicePositionUnspecified];
|
NSMutableArray *deviceTypes = [NSMutableArray array];
|
||||||
|
|
||||||
|
if (@available(iOS 10, *)) {
|
||||||
|
[deviceTypes addObject:AVCaptureDeviceTypeBuiltInWideAngleCamera];
|
||||||
|
[deviceTypes addObject:AVCaptureDeviceTypeBuiltInTelephotoCamera];
|
||||||
|
|
||||||
|
if (@available(iOS 10.2, *)) {
|
||||||
|
[deviceTypes addObject:AVCaptureDeviceTypeBuiltInDualCamera];
|
||||||
|
}
|
||||||
|
|
||||||
|
if (@available(iOS 11.1, *)) {
|
||||||
|
[deviceTypes addObject:AVCaptureDeviceTypeBuiltInTrueDepthCamera];
|
||||||
|
}
|
||||||
|
|
||||||
|
AVCaptureDeviceDiscoverySession *session = [AVCaptureDeviceDiscoverySession
|
||||||
|
discoverySessionWithDeviceTypes:deviceTypes
|
||||||
|
mediaType:AVMediaTypeVideo
|
||||||
|
position:AVCaptureDevicePositionUnspecified];
|
||||||
|
|
||||||
// remove devices that are gone..
|
// remove devices that are gone..
|
||||||
for (int i = feeds.size() - 1; i >= 0; i--) {
|
for (int i = feeds.size() - 1; i >= 0; i--) {
|
||||||
@ -394,6 +414,7 @@ void CameraIOS::update_feeds() {
|
|||||||
add_feed(newfeed);
|
add_feed(newfeed);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
CameraIOS::CameraIOS() {
|
CameraIOS::CameraIOS() {
|
||||||
|
|||||||
Reference in New Issue
Block a user