merge native setImage with setImageWithDepth

This commit is contained in:
Nick Fisher
2025-06-17 13:25:53 +08:00
parent a91aaae131
commit 65ca59ff22
9 changed files with 94 additions and 378 deletions

View File

@@ -636,30 +636,6 @@ external bool Texture_loadImage(
int level,
);
@ffi.Native<
ffi.Bool Function(
ffi.Pointer<TEngine>,
ffi.Pointer<TTexture>,
ffi.Uint32,
ffi.Pointer<ffi.Uint8>,
ffi.Size,
ffi.Uint32,
ffi.Uint32,
ffi.Uint32,
ffi.Uint32,
ffi.Uint32)>(isLeaf: true)
external bool Texture_setImage(
ffi.Pointer<TEngine> tEngine,
ffi.Pointer<TTexture> tTexture,
int level,
ffi.Pointer<ffi.Uint8> data,
int size,
int width,
int height,
int channels,
int bufferFormat,
int pixelDataType,
);
@ffi.Native<
ffi.Bool Function(
@@ -677,7 +653,7 @@ external bool Texture_setImage(
ffi.Uint32,
ffi.Uint32,
ffi.Uint32)>(isLeaf: true)
external bool Texture_setImageWithDepth(
external bool Texture_setImage(
ffi.Pointer<TEngine> tEngine,
ffi.Pointer<TTexture> tTexture,
int level,
@@ -2531,33 +2507,6 @@ external void Texture_loadImageRenderThread(
ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Bool)>> onComplete,
);
@ffi.Native<
ffi.Void Function(
ffi.Pointer<TEngine>,
ffi.Pointer<TTexture>,
ffi.Uint32,
ffi.Pointer<ffi.Uint8>,
ffi.Size,
ffi.Uint32,
ffi.Uint32,
ffi.Uint32,
ffi.Uint32,
ffi.Uint32,
ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Bool)>>)>(
isLeaf: true)
external void Texture_setImageRenderThread(
ffi.Pointer<TEngine> tEngine,
ffi.Pointer<TTexture> tTexture,
int level,
ffi.Pointer<ffi.Uint8> data,
int size,
int width,
int height,
int channels,
int bufferFormat,
int pixelDataType,
ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Bool)>> onComplete,
);
@ffi.Native<
ffi.Void Function(
@@ -2574,10 +2523,9 @@ external void Texture_setImageRenderThread(
ffi.Uint32,
ffi.Uint32,
ffi.Uint32,
ffi.Uint32,
ffi.Pointer<ffi.NativeFunction<ffi.Void Function(ffi.Bool)>>)>(
isLeaf: true)
external void Texture_setImageWithDepthRenderThread(
external void Texture_setImageRenderThread(
ffi.Pointer<TEngine> tEngine,
ffi.Pointer<TTexture> tTexture,
int level,
@@ -2588,7 +2536,6 @@ external void Texture_setImageWithDepthRenderThread(
int z_offset,
int width,
int height,
int channels,
int depth,
int bufferFormat,
int pixelDataType,

View File

@@ -752,19 +752,8 @@ extension type NativeLibrary(JSObject _) implements JSObject {
int pixelDataType,
int level,
);
external int _Texture_setImage(
Pointer<TEngine> tEngine,
Pointer<TTexture> tTexture,
int level,
Pointer<Uint8> data,
size_t size,
int width,
int height,
int channels,
int bufferFormat,
int pixelDataType,
);
external int _Texture_setImageWithDepth(
Pointer<TEngine> tEngine,
Pointer<TTexture> tTexture,
int level,
@@ -775,7 +764,6 @@ extension type NativeLibrary(JSObject _) implements JSObject {
int z_offset,
int width,
int height,
int channels,
int depth,
int bufferFormat,
int pixelDataType,
@@ -1748,19 +1736,6 @@ extension type NativeLibrary(JSObject _) implements JSObject {
Pointer<self.NativeFunction<void Function(bool)>> onComplete,
);
external void _Texture_setImageRenderThread(
Pointer<TEngine> tEngine,
Pointer<TTexture> tTexture,
int level,
Pointer<Uint8> data,
size_t size,
int width,
int height,
int channels,
int bufferFormat,
int pixelDataType,
Pointer<self.NativeFunction<void Function(bool)>> onComplete,
);
external void _Texture_setImageWithDepthRenderThread(
Pointer<TEngine> tEngine,
Pointer<TTexture> tTexture,
int level,
@@ -1771,7 +1746,6 @@ extension type NativeLibrary(JSObject _) implements JSObject {
int z_offset,
int width,
int height,
int channels,
int depth,
int bufferFormat,
int pixelDataType,
@@ -3024,23 +2998,6 @@ bool Texture_loadImage(
}
bool Texture_setImage(
self.Pointer<TEngine> tEngine,
self.Pointer<TTexture> tTexture,
int level,
self.Pointer<Uint8> data,
Dart__darwin_size_t size,
int width,
int height,
int channels,
int bufferFormat,
int pixelDataType,
) {
final result = _lib._Texture_setImage(tEngine.cast(), tTexture.cast(), level,
data, size, width, height, channels, bufferFormat, pixelDataType);
return result == 1;
}
bool Texture_setImageWithDepth(
self.Pointer<TEngine> tEngine,
self.Pointer<TTexture> tTexture,
int level,
@@ -3051,12 +3008,11 @@ bool Texture_setImageWithDepth(
int z_offset,
int width,
int height,
int channels,
int depth,
int bufferFormat,
int pixelDataType,
) {
final result = _lib._Texture_setImageWithDepth(
final result = _lib._Texture_setImage(
tEngine.cast(),
tTexture.cast(),
level,
@@ -3067,7 +3023,6 @@ bool Texture_setImageWithDepth(
z_offset,
width,
height,
channels,
depth,
bufferFormat,
pixelDataType);
@@ -5083,46 +5038,17 @@ void Texture_setImageRenderThread(
int level,
self.Pointer<Uint8> data,
Dart__darwin_size_t size,
int x_offset,
int y_offset,
int z_offset,
int width,
int height,
int channels,
int depth,
int bufferFormat,
int pixelDataType,
self.Pointer<self.NativeFunction<void Function(bool)>> onComplete,
) {
final result = _lib._Texture_setImageRenderThread(
tEngine.cast(),
tTexture.cast(),
level,
data,
size,
width,
height,
channels,
bufferFormat,
pixelDataType,
onComplete.cast());
return result;
}
void Texture_setImageWithDepthRenderThread(
self.Pointer<TEngine> tEngine,
self.Pointer<TTexture> tTexture,
int level,
self.Pointer<Uint8> data,
Dart__darwin_size_t size,
int x_offset,
int y_offset,
int z_offset,
int width,
int height,
int channels,
int depth,
int bufferFormat,
int pixelDataType,
self.Pointer<self.NativeFunction<void Function(bool)>> onComplete,
) {
final result = _lib._Texture_setImageWithDepthRenderThread(
tEngine.cast(),
tTexture.cast(),
level,
@@ -5133,7 +5059,6 @@ void Texture_setImageWithDepthRenderThread(
z_offset,
width,
height,
channels,
depth,
bufferFormat,
pixelDataType,

View File

@@ -30,7 +30,8 @@ class FFITexture extends Texture {
@override
Future<void> generateMipmaps() async {
await withVoidCallback((requestId, cb) => Texture_generateMipMapsRenderThread(pointer, _engine, requestId, cb));
await withVoidCallback((requestId, cb) =>
Texture_generateMipMapsRenderThread(pointer, _engine, requestId, cb));
}
@override
@@ -73,7 +74,8 @@ class FFITexture extends Texture {
@override
Future<void> setImage(int level, Uint8List buffer, int width, int height,
int channels, PixelDataFormat format, PixelDataType type) async {
PixelDataFormat format, PixelDataType type,
{int depth = 1, int xOffset = 0, int yOffset = 0, int zOffset = 0 }) async {
final success = await withBoolCallback((cb) {
Texture_setImageRenderThread(
_engine,
@@ -81,9 +83,10 @@ class FFITexture extends Texture {
level,
buffer.address,
buffer.lengthInBytes,
xOffset, yOffset, zOffset,
width,
height,
channels,
depth,
format.index,
type.index,
cb);
@@ -94,44 +97,6 @@ class FFITexture extends Texture {
}
}
@override
Future<void> setImage3D(
int level,
int xOffset,
int yOffset,
int zOffset,
int width,
int height,
int channels,
int depth,
Uint8List buffer,
PixelDataFormat format,
PixelDataType type) async {
throw UnimplementedError();
// final success = await withBoolCallback((cb) {
// Texture_setImageWithDepthRenderThread(
// _engine,
// pointer,
// level,
// buffer.address,
// buffer.lengthInBytes,
// 0,
// 0,
// zOffset,
// width,
// height,
// channels,
// depth,
// format.index,
// type.index,
// cb);
// });
// if (!success) {
// throw Exception("Failed to set image");
// }
}
@override
Future<void> setSubImage(
int level,

View File

@@ -333,30 +333,18 @@ abstract class Texture {
/// Sets the given [image] as the source data for this texture.
///
Future setLinearImage(
covariant LinearImage image, PixelDataFormat format, PixelDataType type, {int level = 0});
covariant LinearImage image, PixelDataFormat format, PixelDataType type,
{int level = 0});
/// Sets the image data for a 2D texture or a texture level
Future setImage(int level, Uint8List buffer, int width, int height,
int channels, PixelDataFormat format, PixelDataType type);
Future<void> setImage(int level, Uint8List buffer, int width, int height,
PixelDataFormat format, PixelDataType type,
{int depth = 1, int xOffset = 0, int yOffset = 0, int zOffset = 0});
/// Sets the image data for a region of a 2D texture
Future setSubImage(int level, int xOffset, int yOffset, int width, int height,
Uint8List buffer, PixelDataFormat format, PixelDataType type);
/// Sets the image data for a 3D texture or cubemap
Future setImage3D(
int level,
int xOffset,
int yOffset,
int zOffset,
int width,
int height,
int channels,
int depth,
Uint8List buffer,
PixelDataFormat format,
PixelDataType type);
/// Sets an external image (like a video or camera frame) as the texture source
Future setExternalImage(dynamic externalImage);
@@ -407,15 +395,16 @@ enum PixelDataFormat {
/// The integer value of the enum
final int value;
/// Constructor with the integer value
const PixelDataFormat(this.value);
/// Factory constructor to create a PixelDataFormat from an integer value
factory PixelDataFormat.fromValue(int value) {
return PixelDataFormat.values.firstWhere(
(format) => format.value == value,
orElse: () => throw ArgumentError('Invalid PixelDataFormat value: $value'),
orElse: () =>
throw ArgumentError('Invalid PixelDataFormat value: $value'),
);
}
}
@@ -460,10 +449,10 @@ enum PixelDataType {
/// The integer value of the enum
final int value;
/// Constructor with the integer value
const PixelDataType(this.value);
/// Factory constructor to create a PixelDataType from an integer value
factory PixelDataType.fromValue(int value) {
return PixelDataType.values.firstWhere(
@@ -473,7 +462,6 @@ enum PixelDataType {
}
}
@deprecated
typedef ThermionTexture = Texture;
@@ -483,34 +471,26 @@ abstract class LinearImage {
Future<int> getWidth();
Future<int> getHeight();
Future<int> getChannels();
/// Decodes the image contained in [data] and returns a texture of
/// the corresponding size with the image set as mip-level 0.
///
///
static Future<Texture> decodeToTexture(Uint8List data, {
TextureFormat textureFormat = TextureFormat.RGB32F,
PixelDataFormat pixelDataFormat = PixelDataFormat.RGB,
PixelDataType pixelDataType = PixelDataType.FLOAT,
int levels = 1,
bool requireAlpha = false}) async {
final decodedImage = await FilamentApp.instance!.decodeImage(data, requireAlpha: requireAlpha);
final texture = await FilamentApp.instance!.createTexture(
await decodedImage.getWidth(),
await decodedImage.getHeight(),
textureFormat: textureFormat,
levels:levels
);
await texture.setLinearImage(
decodedImage,
pixelDataFormat,
pixelDataType
);
/// Decodes the image contained in [data] and returns a texture of
/// the corresponding size with the image set as mip-level 0.
///
///
static Future<Texture> decodeToTexture(Uint8List data,
{TextureFormat textureFormat = TextureFormat.RGB32F,
PixelDataFormat pixelDataFormat = PixelDataFormat.RGB,
PixelDataType pixelDataType = PixelDataType.FLOAT,
int levels = 1,
bool requireAlpha = false}) async {
final decodedImage = await FilamentApp.instance!
.decodeImage(data, requireAlpha: requireAlpha);
final texture = await FilamentApp.instance!.createTexture(
await decodedImage.getWidth(), await decodedImage.getHeight(),
textureFormat: textureFormat, levels: levels);
await texture.setLinearImage(decodedImage, pixelDataFormat, pixelDataType);
return texture;
}
}