mirror of
https://github.com/defold/extension-camera
synced 2025-06-27 10:27:45 +02:00
Compare commits
11 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
5db8d5c072 | ||
|
851f3dee87 | ||
|
73c3596156 | ||
|
d58f5ec46b | ||
|
89de4ccd59 | ||
|
e32dd144b6 | ||
|
6d420fc011 | ||
|
e07bd373ec | ||
|
6b01fcb6d6 | ||
|
cb4ab80e04 | ||
|
406edd5c37 |
@ -1,18 +1,10 @@
|
|||||||
name: "Camera"
|
name: "Camera"
|
||||||
|
|
||||||
platforms:
|
platforms:
|
||||||
x86_64-osx:
|
osx:
|
||||||
context:
|
|
||||||
frameworks: ["AVFoundation", "CoreMedia"]
|
|
||||||
|
|
||||||
x86-osx:
|
|
||||||
context:
|
context:
|
||||||
frameworks: ["AVFoundation", "CoreMedia"]
|
frameworks: ["AVFoundation", "CoreMedia"]
|
||||||
|
|
||||||
arm64-ios:
|
ios:
|
||||||
context:
|
|
||||||
frameworks: ["AVFoundation", "CoreMedia", "UIKit"]
|
|
||||||
|
|
||||||
armv7-ios:
|
|
||||||
context:
|
context:
|
||||||
frameworks: ["AVFoundation", "CoreMedia", "UIKit"]
|
frameworks: ["AVFoundation", "CoreMedia", "UIKit"]
|
||||||
|
@ -1,3 +1,7 @@
|
|||||||
dependencies {
|
repositories {
|
||||||
compile 'androidx.core:core:1.2.0'
|
mavenCentral()
|
||||||
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation 'androidx.core:core:1.2.0'
|
||||||
}
|
}
|
||||||
|
@ -45,7 +45,7 @@ public class AndroidCamera extends Fragment
|
|||||||
private boolean newFrame;
|
private boolean newFrame;
|
||||||
private int position;
|
private int position;
|
||||||
private int quality;
|
private int quality;
|
||||||
private Camera.Size size;
|
private Camera.Size previewSize;
|
||||||
|
|
||||||
private static Context context;
|
private static Context context;
|
||||||
|
|
||||||
@ -132,26 +132,43 @@ public class AndroidCamera extends Fragment
|
|||||||
|
|
||||||
Camera.Parameters params = camera.getParameters();
|
Camera.Parameters params = camera.getParameters();
|
||||||
|
|
||||||
List<Camera.Size> sizes = params.getSupportedPreviewSizes();
|
List<Camera.Size> previewSizes = params.getSupportedPreviewSizes();
|
||||||
|
List<String> focusModes = params.getSupportedFocusModes();
|
||||||
|
List<Camera.Size> pictureSizes = params.getSupportedPictureSizes();
|
||||||
|
List<Integer> supportedFormats = params.getSupportedPictureFormats();
|
||||||
|
|
||||||
|
Camera.Size pictureSize;
|
||||||
switch(this.quality)
|
switch(this.quality)
|
||||||
{
|
{
|
||||||
case CAPTURE_QUALITY_HIGH:
|
case CAPTURE_QUALITY_HIGH:
|
||||||
this.size = sizes.get(sizes.size() - 1);
|
this.previewSize = previewSizes.get(previewSizes.size() - 1);
|
||||||
|
pictureSize = pictureSizes.get(previewSizes.size() - 1);
|
||||||
break;
|
break;
|
||||||
case CAPTURE_QUALITY_LOW:
|
case CAPTURE_QUALITY_LOW:
|
||||||
this.size = sizes.get(0);
|
this.previewSize = previewSizes.get(0);
|
||||||
|
pictureSize = pictureSizes.get(0);
|
||||||
break;
|
break;
|
||||||
case CAPTURE_QUALITY_MEDIUM:
|
case CAPTURE_QUALITY_MEDIUM:
|
||||||
default:
|
default:
|
||||||
this.size = sizes.get((int)Math.ceil(sizes.size() / 2));
|
this.previewSize = previewSizes.get((int)Math.ceil(previewSizes.size() / 2));
|
||||||
|
pictureSize = pictureSizes.get((int)Math.ceil(previewSizes.size() / 2));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
params.setPreviewSize(this.size.width, this.size.height);
|
if (focusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE))
|
||||||
params.setPictureSize(this.size.width, this.size.height);
|
{
|
||||||
params.setPictureFormat(PixelFormat.JPEG);
|
params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
|
||||||
params.setJpegQuality(90);
|
}
|
||||||
params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
|
|
||||||
|
params.setPreviewSize(this.previewSize.width, this.previewSize.height);
|
||||||
|
params.setPictureSize(pictureSize.width, pictureSize.height);
|
||||||
|
|
||||||
|
if (supportedFormats.contains(PixelFormat.JPEG))
|
||||||
|
{
|
||||||
|
params.setPictureFormat(PixelFormat.JPEG);
|
||||||
|
params.setJpegQuality(90);
|
||||||
|
}
|
||||||
|
|
||||||
camera.setParameters(params);
|
camera.setParameters(params);
|
||||||
|
|
||||||
final Activity activity = (Activity)context;
|
final Activity activity = (Activity)context;
|
||||||
@ -166,7 +183,7 @@ public class AndroidCamera extends Fragment
|
|||||||
if(rotation == Surface.ROTATION_180 || rotation == Surface.ROTATION_270)
|
if(rotation == Surface.ROTATION_180 || rotation == Surface.ROTATION_270)
|
||||||
flip = true;
|
flip = true;
|
||||||
|
|
||||||
int[] pixels = convertYUV420_NV21toARGB8888(data, AndroidCamera.this.size.width, AndroidCamera.this.size.height, flip);
|
int[] pixels = convertYUV420_NV21toARGB8888(data, AndroidCamera.this.previewSize.width, AndroidCamera.this.previewSize.height, flip);
|
||||||
frameUpdate(pixels);
|
frameUpdate(pixels);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -179,7 +196,7 @@ public class AndroidCamera extends Fragment
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
captureStarted(this.size.width, this.size.height);
|
captureStarted(this.previewSize.width, this.previewSize.height);
|
||||||
camera.startPreview();
|
camera.startPreview();
|
||||||
queueMessage(CAMERA_STARTED);
|
queueMessage(CAMERA_STARTED);
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
#define MODULE_NAME "camera"
|
#define MODULE_NAME "camera"
|
||||||
|
|
||||||
// Defold SDK
|
// Defold SDK
|
||||||
#define DLIB_LOG_DOMAIN LIB_NAME
|
|
||||||
#include <dmsdk/sdk.h>
|
#include <dmsdk/sdk.h>
|
||||||
|
|
||||||
#if defined(DM_PLATFORM_IOS) || defined(DM_PLATFORM_OSX) || defined(DM_PLATFORM_ANDROID)
|
#if defined(DM_PLATFORM_IOS) || defined(DM_PLATFORM_OSX) || defined(DM_PLATFORM_ANDROID)
|
||||||
@ -71,7 +70,7 @@ static void Camera_ProcessQueue()
|
|||||||
if (message == CAMERA_STARTED)
|
if (message == CAMERA_STARTED)
|
||||||
{
|
{
|
||||||
// Increase ref count
|
// Increase ref count
|
||||||
dmScript::LuaHBuffer luabuffer = {g_DefoldCamera.m_VideoBuffer, false};
|
dmScript::LuaHBuffer luabuffer(g_DefoldCamera.m_VideoBuffer, dmScript::OWNER_C);
|
||||||
dmScript::PushBuffer(L, luabuffer);
|
dmScript::PushBuffer(L, luabuffer);
|
||||||
g_DefoldCamera.m_VideoBufferLuaRef = dmScript::Ref(L, LUA_REGISTRYINDEX);
|
g_DefoldCamera.m_VideoBufferLuaRef = dmScript::Ref(L, LUA_REGISTRYINDEX);
|
||||||
}
|
}
|
||||||
|
@ -16,37 +16,10 @@ https://github.com/defold/extension-camera/archive/master.zip
|
|||||||
We recommend using a link to a zip file of a [specific release](https://github.com/defold/extension-camera/releases).
|
We recommend using a link to a zip file of a [specific release](https://github.com/defold/extension-camera/releases).
|
||||||
|
|
||||||
|
|
||||||
## Configuration
|
|
||||||
The extension can be configured by adding the following fields to game.project:
|
|
||||||
|
|
||||||
```
|
|
||||||
[adinfo]
|
|
||||||
tracking_usage_description = We would like to show you relevant ads.
|
|
||||||
register_for_attribution = 1
|
|
||||||
```
|
|
||||||
|
|
||||||
### tracking_usage_description
|
|
||||||
|
|
||||||
Before requesting advertising info and status on iOS 14 the application must request user authorization to access app-related data for tracking the user or the device. This is done automatically when `adinfo.get()` is called. The string set in `adinfo.tracking_usage_description` will be shown to the user.
|
|
||||||
|
|
||||||
Apple documentation: https://developer.apple.com/documentation/apptrackingtransparency?language=objc
|
|
||||||
|
|
||||||
### register_for_attribution
|
|
||||||
|
|
||||||
The extension can automatically register the application for ad network attribution using `SkAdNetwork` and the `registerAppForAdNetworkAttribution()` function. Enable this functionality by setting `adinfo.register_for_attribution` to 1 in game.project.
|
|
||||||
|
|
||||||
Apple documentation: https://developer.apple.com/documentation/storekit/skadnetwork
|
|
||||||
|
|
||||||
|
|
||||||
## Example
|
## Example
|
||||||
|
|
||||||
```lua
|
Refer to the [example project](https://github.com/defold/extension-camera/blob/master/main/main.script).
|
||||||
function init(self)
|
|
||||||
adinfo.get(function(self, info)
|
|
||||||
print(info.ad_ident, info.ad_tracking_enabled)
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
```
|
|
||||||
|
|
||||||
## FAQ
|
## FAQ
|
||||||
|
|
||||||
@ -61,7 +34,4 @@ tccutil reset Camera
|
|||||||
|
|
||||||
## Source code
|
## Source code
|
||||||
|
|
||||||
The source code is available on [GitHub](https://github.com/defold/extension-adinfo)
|
The source code is available on [GitHub](https://github.com/defold/extension-camera)
|
||||||
|
|
||||||
|
|
||||||
## API reference
|
|
||||||
|
8
main/default.font
Normal file
8
main/default.font
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
font: "/builtins/fonts/vera_mo_bd.ttf"
|
||||||
|
material: "/builtins/fonts/font-df.material"
|
||||||
|
size: 14
|
||||||
|
antialias: 1
|
||||||
|
alpha: 1.0
|
||||||
|
shadow_alpha: 0.0
|
||||||
|
shadow_blur: 0
|
||||||
|
output_format: TYPE_DISTANCE_FIELD
|
@ -16,14 +16,19 @@ embedded_instances {
|
|||||||
" z: 0.0\n"
|
" z: 0.0\n"
|
||||||
" w: 1.0\n"
|
" w: 1.0\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
|
" property_decls {\n"
|
||||||
|
" }\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
"embedded_components {\n"
|
"embedded_components {\n"
|
||||||
" id: \"sprite\"\n"
|
" id: \"sprite\"\n"
|
||||||
" type: \"sprite\"\n"
|
" type: \"sprite\"\n"
|
||||||
" data: \"tile_set: \\\"/main/camera.atlas\\\"\\n"
|
" data: \"default_animation: \\\"logo\\\"\\n"
|
||||||
"default_animation: \\\"logo\\\"\\n"
|
|
||||||
"material: \\\"/builtins/materials/sprite.material\\\"\\n"
|
"material: \\\"/builtins/materials/sprite.material\\\"\\n"
|
||||||
"blend_mode: BLEND_MODE_ALPHA\\n"
|
"blend_mode: BLEND_MODE_ALPHA\\n"
|
||||||
|
"textures {\\n"
|
||||||
|
" sampler: \\\"texture_sampler\\\"\\n"
|
||||||
|
" texture: \\\"/main/camera.atlas\\\"\\n"
|
||||||
|
"}\\n"
|
||||||
"\"\n"
|
"\"\n"
|
||||||
" position {\n"
|
" position {\n"
|
||||||
" x: 0.0\n"
|
" x: 0.0\n"
|
||||||
@ -60,10 +65,13 @@ embedded_instances {
|
|||||||
data: "embedded_components {\n"
|
data: "embedded_components {\n"
|
||||||
" id: \"sprite\"\n"
|
" id: \"sprite\"\n"
|
||||||
" type: \"sprite\"\n"
|
" type: \"sprite\"\n"
|
||||||
" data: \"tile_set: \\\"/main/logo.atlas\\\"\\n"
|
" data: \"default_animation: \\\"logo\\\"\\n"
|
||||||
"default_animation: \\\"logo\\\"\\n"
|
|
||||||
"material: \\\"/builtins/materials/sprite.material\\\"\\n"
|
"material: \\\"/builtins/materials/sprite.material\\\"\\n"
|
||||||
"blend_mode: BLEND_MODE_ALPHA\\n"
|
"blend_mode: BLEND_MODE_ALPHA\\n"
|
||||||
|
"textures {\\n"
|
||||||
|
" sampler: \\\"texture_sampler\\\"\\n"
|
||||||
|
" texture: \\\"/main/logo.atlas\\\"\\n"
|
||||||
|
"}\\n"
|
||||||
"\"\n"
|
"\"\n"
|
||||||
" position {\n"
|
" position {\n"
|
||||||
" x: 0.0\n"
|
" x: 0.0\n"
|
||||||
@ -86,12 +94,6 @@ embedded_instances {
|
|||||||
" z: 0.0\\n"
|
" z: 0.0\\n"
|
||||||
" w: 0.0\\n"
|
" w: 0.0\\n"
|
||||||
"}\\n"
|
"}\\n"
|
||||||
"scale {\\n"
|
|
||||||
" x: 1.0\\n"
|
|
||||||
" y: 1.0\\n"
|
|
||||||
" z: 1.0\\n"
|
|
||||||
" w: 0.0\\n"
|
|
||||||
"}\\n"
|
|
||||||
"color {\\n"
|
"color {\\n"
|
||||||
" x: 1.0\\n"
|
" x: 1.0\\n"
|
||||||
" y: 1.0\\n"
|
" y: 1.0\\n"
|
||||||
@ -116,8 +118,8 @@ embedded_instances {
|
|||||||
"blend_mode: BLEND_MODE_ALPHA\\n"
|
"blend_mode: BLEND_MODE_ALPHA\\n"
|
||||||
"line_break: false\\n"
|
"line_break: false\\n"
|
||||||
"text: \\\"Space/Touch to toggle capture\\\"\\n"
|
"text: \\\"Space/Touch to toggle capture\\\"\\n"
|
||||||
"font: \\\"/builtins/fonts/system_font.font\\\"\\n"
|
"font: \\\"/main/default.font\\\"\\n"
|
||||||
"material: \\\"/builtins/fonts/label.material\\\"\\n"
|
"material: \\\"/builtins/fonts/label-df.material\\\"\\n"
|
||||||
"\"\n"
|
"\"\n"
|
||||||
" position {\n"
|
" position {\n"
|
||||||
" x: 90.0\n"
|
" x: 90.0\n"
|
||||||
@ -140,12 +142,6 @@ embedded_instances {
|
|||||||
" z: 0.0\\n"
|
" z: 0.0\\n"
|
||||||
" w: 0.0\\n"
|
" w: 0.0\\n"
|
||||||
"}\\n"
|
"}\\n"
|
||||||
"scale {\\n"
|
|
||||||
" x: 1.0\\n"
|
|
||||||
" y: 1.0\\n"
|
|
||||||
" z: 1.0\\n"
|
|
||||||
" w: 0.0\\n"
|
|
||||||
"}\\n"
|
|
||||||
"color {\\n"
|
"color {\\n"
|
||||||
" x: 1.0\\n"
|
" x: 1.0\\n"
|
||||||
" y: 1.0\\n"
|
" y: 1.0\\n"
|
||||||
@ -172,8 +168,8 @@ embedded_instances {
|
|||||||
"text: \\\"label\\\\n"
|
"text: \\\"label\\\\n"
|
||||||
"\\\"\\n"
|
"\\\"\\n"
|
||||||
" \\\"\\\"\\n"
|
" \\\"\\\"\\n"
|
||||||
"font: \\\"/builtins/fonts/system_font.font\\\"\\n"
|
"font: \\\"/main/default.font\\\"\\n"
|
||||||
"material: \\\"/builtins/fonts/label.material\\\"\\n"
|
"material: \\\"/builtins/fonts/label-df.material\\\"\\n"
|
||||||
"\"\n"
|
"\"\n"
|
||||||
" position {\n"
|
" position {\n"
|
||||||
" x: 90.0\n"
|
" x: 90.0\n"
|
||||||
|
@ -3,7 +3,6 @@ local function stop_capture(self)
|
|||||||
if self.cameraframe == nil then
|
if self.cameraframe == nil then
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
self.cameraframe = nil
|
self.cameraframe = nil
|
||||||
camera.stop_capture()
|
camera.stop_capture()
|
||||||
|
|
||||||
@ -24,7 +23,7 @@ local function start_capture(self)
|
|||||||
type = camera.CAMERA_TYPE_BACK
|
type = camera.CAMERA_TYPE_BACK
|
||||||
quality = camera.CAPTURE_QUALITY_MEDIUM
|
quality = camera.CAPTURE_QUALITY_MEDIUM
|
||||||
end
|
end
|
||||||
|
|
||||||
camera.start_capture(type, quality, function(self, status)
|
camera.start_capture(type, quality, function(self, status)
|
||||||
if status == camera.CAMERA_STARTED then
|
if status == camera.CAMERA_STARTED then
|
||||||
self.cameraframe = camera.get_frame()
|
self.cameraframe = camera.get_frame()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user